您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12705|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。( [. M& |0 r$ {# \, _' b* G. J: _
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 A5 I/ G  y3 R1 h4 O/ A
Talk is cheak , show me the code.3 G: ?6 `6 Q4 Z% f$ V9 }
服务端代码:7 e! M" E7 W; p2 _0 q
  1. #include<stdlib.h>
    1 R8 f9 I5 W/ ]7 N0 d7 M  F
  2. #include<WinSock2.h>! e& s1 \* S' G$ l+ k- }" D; O- f
  3. #pragma comment(lib,"ws2_32.lib")4 H/ l0 p- Y5 ?; S
  4. int main(){
    6 r# e. a, q% l$ l' V
  5.     WSADATA wsd;
    - M  X( i: {0 G6 i2 Z5 Y
  6.     SOCKET sockServer;% K6 u0 G4 }6 M1 g4 ^2 M
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号+ @$ j% @1 j5 a" ]  X1 `
  8.     SOCKET sockClient;
    , c. F4 Y2 ?( f2 K; H& L0 x
  9.     SOCKADDR_IN clientaddr;
    $ V  Q1 d3 O( i/ j! S0 j
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    / X) x9 Q' L/ e6 |: p
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket5 V& c3 B; D; b; b5 U
  12. + D- P( C! m8 z& G$ k
  13. * |9 @) W6 s+ y: O# T
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ( K( F. b1 w- K4 K, F
  15.         printf("Socket has been created :%d", sockServer);% f) P7 R1 O* Y1 g. _
  16.     }, V  m& ~+ d: ^& r" p
  17.     else{8 ^2 M4 V+ N) c) ]
  18.         printf("Socket create failed.");
    , H, `. E# `! v6 o2 C
  19.         exit(0);  g' U- l' d. r
  20.     }' d( ?2 x5 x* z/ H5 r  q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);# _( |0 @6 E, A: h9 G" @$ x$ [
  22.     serveraddr.sin_family = AF_INET;
    % H- W/ q1 T" G9 F0 n3 y( Z$ g
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * P2 _: H9 f1 j
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    6 c/ B- l+ y0 ~, j, J
  25.     char recvBuf[100];7 ^; @. c( l/ ?
  26.     int len = sizeof(SOCKADDR);( a* V, v$ t; s! Q5 i
  27.     listen(sockServer, 5);//5为等待连接数
    . D3 @9 W3 F' I. g4 _
  28.     while (1){
    5 q: I: S: Q, k$ U( B+ {
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    2 C' x6 `6 x4 b3 X$ N
  30.         //接收客户端数据
    3 E4 _' k2 y8 I& @( O0 O4 F* e7 v/ ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);# V0 ]8 {8 `( z' a  n1 j/ Y! P8 ^
  32.         printf("to me:%s\n",recvBuf);
    2 u5 B  C! W1 \' C
  33.         memset(recvBuf, 0, 100);1 ~' i/ n5 ?& o6 G
  34.     }
    $ q7 Y2 k9 T- _. G
  35.     closesocket(sockClient);
    2 m# O" M9 K. K4 e: X$ v
  36.     system("pause");; [2 ?) d: I. c9 J
  37.     return 0;7 A% Y! _( m2 G" x
  38. }
复制代码
客户端代码:
5 j2 G, \, E6 \4 |" C2 }& r9 {
  1. #include<winsock2.h>3 v: e  r. Q( ~7 p# f
  2. #include<stdio.h>% C" p5 _' P6 t& q
  3. #pragma comment(lib, "ws2_32.lib")( j0 q; r2 D$ V: F1 u
  4. void main()
    8 a) y/ e  z# h& Q, U: R+ |' c
  5. {: D' g) B2 k' j1 [) ~
  6.     WSADATA wsaData;7 k9 ]! `: |( b9 `! N
  7.     SOCKET sockClient;//客户端Socket
    5 `" E/ Y) [7 k" z0 s. [! A" `2 b# P4 u5 x
  8.     SOCKADDR_IN addrServer;//服务端地址
    4 M, X6 M: L5 n- ~5 ^7 D  `1 s% Y1 V
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    3 ~. j/ @+ _7 Y7 ^1 B
  10.     char message[20] = "HelloSocket!";! q0 j$ Z' r2 F4 A' V. b
  11.     //定义要连接的服务端地址  b0 h" k% t2 V; N0 W5 v
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ! u) P0 U, h# L) Z6 E
  13.     addrServer.sin_family = AF_INET;
    , E! W" R6 M" k' Y
  14.     addrServer.sin_port = htons(6000);//连接端口6000  s6 B* [' y/ o; n, \, V
  15.     //新建客户端socket
    $ t" i. Q: Y3 L: @" _* m, o
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);2 F% m' ?0 C7 F6 l# o* z( e3 S3 N0 Q
  17.     int s = 0;- e" h0 O& S- R# U8 V5 [
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));( Y+ j& _8 v- \  k* x! z
  19. & r1 X6 ^7 E0 H* g% _) Z
  20.     while (1){/ d, U7 P5 `! f7 m# F8 R' O
  21.         //发送数据
    . g6 p! S, o7 w6 }5 c0 Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    / ~; D* B/ s5 P4 {
  23.         printf("to server:");
    - U- f7 r) h  E0 e4 g* H. b9 d
  24.         scanf("%s", message);
    9 o0 n2 J9 {! I  H, }& e6 X

  25. 9 X! v0 D( \1 J! e! x- B
  26.     }
    ( A) x7 E& p% Q* U" T% a8 y
  27.     //关闭socket% _5 y: k! B" g6 o+ {$ B6 K0 W
  28.     closesocket(sockClient);/ I9 l% c! K; i/ x# u$ m
  29.     WSACleanup();
    6 Z2 h" U* M* D9 D% Z/ f0 `3 L
  30. }
复制代码
求懂的高手来解答一下。- M- O" M$ k& O+ Q& t% J
谢谢了!- I( x" O! `6 a6 q

) v! ]2 l2 J9 e+ P1 a9 J$ h5 L& y8 Z2 I! P; q
: }' }5 n$ [# u+ B. V9 }+ K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
  ]* w' ^3 T- _" g$ \% N, {0 Lrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:09 , Processed in 0.109954 second(s), 18 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!