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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3208|回复: 2

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

[复制链接]
发表于 2020-5-9 02:32:26 | 显示全部楼层 |阅读模式
大家好,感谢你的回复。6 ~  }. `: O6 t
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。& F* ?1 l$ n* |) G; ?7 x
Talk is cheak , show me the code.7 Q# m' A0 y+ c# i! Q, R: J8 r
服务端代码:
8 _8 n5 y0 T3 `; ]
  1. #include<stdlib.h>8 t8 J# K7 |$ |# m1 u+ z
  2. #include<WinSock2.h>
    ! B: y6 M5 t. o& Z' u; {
  3. #pragma comment(lib,"ws2_32.lib")% M3 y! Q+ q& a# ]7 J3 }1 `# J
  4. int main(){6 w! D. m! g5 V1 Q. Y
  5.     WSADATA wsd;% ?$ }' k, m! r; J3 ?: T, z% `
  6.     SOCKET sockServer;
    0 Z5 Y( X. Z& s9 P1 x" ^1 a
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号1 @9 e* r% D5 L$ Z
  8.     SOCKET sockClient;
    ) C; u* ?5 C8 ^1 `9 Y
  9.     SOCKADDR_IN clientaddr;
      R2 \* ?& E+ I) c; l( H
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口6 i9 E) O% C- t! `/ \
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket- x% E. P) ?( I9 q  G% a" J
  12. # ]0 ]& r& g" w/ B/ _4 a+ o
  13. ! e0 t- F- m8 Y* \: w. g
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
      y4 A, X4 n, u) G# V6 ~: O. e
  15.         printf("Socket has been created :%d", sockServer);
    ; f4 w' ?- Z0 W2 X! j7 x
  16.     }6 e: h" n; D; U+ O! [* s
  17.     else{
    $ e9 ?7 F2 B6 e- C0 J$ U
  18.         printf("Socket create failed.");
    % f; z$ {5 d! H
  19.         exit(0);8 O7 t. j6 v- a) p- U% D" Z3 x% J3 I
  20.     }" B, I* w) |1 g, w
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);6 k) y% @' v4 d6 J
  22.     serveraddr.sin_family = AF_INET;
      D- K0 r& `4 G0 }& ^
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    0 ]* ]0 D  K' d0 L/ y$ X
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    / G/ U& @) a1 J5 l7 T  N
  25.     char recvBuf[100];
    4 l0 C8 @6 L  x& H$ F
  26.     int len = sizeof(SOCKADDR);
    9 a  n3 S1 @4 R% B0 ~. a3 i
  27.     listen(sockServer, 5);//5为等待连接数5 s6 y$ |' ?: b0 c( ]3 D
  28.     while (1){9 X% a- U" b* s, B
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ( H: d. X& h( d" w# `
  30.         //接收客户端数据; h9 n1 }5 l6 {! I) A/ L
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);: d* \, ?% ]# A1 o  R& l' [2 Y0 s& P
  32.         printf("to me:%s\n",recvBuf);# `% Z4 l4 N( f. R" ]! C
  33.         memset(recvBuf, 0, 100);
    / X: }: s; h6 Z( N; k: p/ Z0 P
  34.     }4 q0 i' j* }+ ]; p) I' U
  35.     closesocket(sockClient);
    8 F7 @( r# |, X# \8 l0 B" [0 S5 Z
  36.     system("pause");
      R# U+ a, g1 @" Y
  37.     return 0;! P5 X, f, p& ~8 @- \. Q- Z
  38. }
复制代码
客户端代码:# \8 v" I% \4 n# i
  1. #include<winsock2.h>6 b) q0 T0 P& Z$ f
  2. #include<stdio.h>
    $ T& |9 f$ }2 R1 i1 j8 r; E
  3. #pragma comment(lib, "ws2_32.lib")
    0 s) \* L) s6 d6 D  R+ W& v
  4. void main()
    4 g; D2 y; x2 q( I# f4 V
  5. {6 t; ^, ^1 o& ]% b# Q) x; |
  6.     WSADATA wsaData;/ B; Z4 m. E1 J5 s. W# J
  7.     SOCKET sockClient;//客户端Socket" q4 @5 @9 @# M8 e, E1 p
  8.     SOCKADDR_IN addrServer;//服务端地址
      H" p- `* X1 P4 X8 I
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);  q2 l/ Q& C: t- t* b5 f: Q; b3 B1 T
  10.     char message[20] = "HelloSocket!";& T7 x2 j& S) y! H
  11.     //定义要连接的服务端地址
    + H( w( a' Q& S' b( z. N- x3 g
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址); Y5 X- V: ~2 r' t" T
  13.     addrServer.sin_family = AF_INET;, Q1 ?$ k0 c4 ^2 c5 r
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    4 p) z* ^! y' L1 ^
  15.     //新建客户端socket$ S1 C0 k3 Y  e; H6 G' g
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    / m0 I4 p( D- C" f! m. e9 M4 p
  17.     int s = 0;
    / K' z6 c. N  D0 O/ P2 C6 b# M
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    . D$ w6 q. f0 {! J! Z) O% J3 Z* C
  19. 3 B. a3 v! C" H% `' f$ F* s
  20.     while (1){6 D/ |0 ^6 b  s# D+ o4 ^5 n) O4 z: q7 K
  21.         //发送数据4 L, G, \! O  t$ u* j2 l
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
      r1 X. ]( s/ O' `& X+ |
  23.         printf("to server:");
    5 F$ ^$ o, @( {' c- S
  24.         scanf("%s", message);
    ( S& l( r( o. z; o1 @: e6 O, |
  25. $ v. }  q1 g4 M6 _; }
  26.     }0 }  n3 m2 O& j. G  z! p5 c
  27.     //关闭socket0 L% L  @' a& O/ w0 H
  28.     closesocket(sockClient);( K6 P, ^( \4 T$ O. B; H3 d
  29.     WSACleanup();
    - i5 Q+ ^: i; K& q2 x. r- b
  30. }
复制代码
求懂的高手来解答一下。
5 Q* P& K! v# ?# X2 y  i谢谢了!
5 d' p/ e( R; ]6 Z
3 m7 {/ X  f% B) N8 K

8 |7 G2 U" p7 i. v( P% k% @$ X. |6 X3 D+ B
 楼主| 发表于 2020-5-9 02:33:06 | 显示全部楼层
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 02:33:20 | 显示全部楼层
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为  w1 a$ T; k- P% p' o) Q# F2 u  n( m
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2021-9-17 14:59 , Processed in 0.128514 second(s), 19 queries .

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