cncml手绘网

标题: C语言 socket 编写简单服务端客户端通信问题 [打印本页]

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
+ V: u, @0 g  L2 i/ p0 q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 O4 N  g! F: d" u% y8 l/ oTalk is cheak , show me the code.
! |* o& @, T2 m4 v% b' d3 d服务端代码:
& n7 k8 o$ k+ k! r* r
  1. #include<stdlib.h>$ @  D( I( G& V/ |" K. T
  2. #include<WinSock2.h>  p6 Q& {- \. c2 ^8 `& [
  3. #pragma comment(lib,"ws2_32.lib")
    5 K& N! G9 \* D7 D) `3 H2 i1 I1 x
  4. int main(){! l' o& i) ~8 D& N
  5.     WSADATA wsd;
    , E8 ]# c* ?/ P6 I
  6.     SOCKET sockServer;/ }# ^. g# k% U
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ; E5 }" r% o+ r( I* d4 J
  8.     SOCKET sockClient;, z8 i: g" ^. k  @8 y& S9 K# d
  9.     SOCKADDR_IN clientaddr;
    * y6 V6 V* _3 H4 t
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    3 A! m9 E" I- Z  [- g
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    $ o1 W. r- ?8 r5 t, D. _) o7 x* w8 o
  12. , B2 y& x6 u9 J. {5 `8 q4 ^7 O; m' D# q
  13. 3 Y2 ?0 e# P6 s3 A
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ( L0 \, w9 F) B( |: C5 J
  15.         printf("Socket has been created :%d", sockServer);& ~, I1 U7 N9 z' I
  16.     }
    ; v& h) |# d7 b8 Q! \4 J5 x
  17.     else{4 b6 X# t9 Q5 r2 q6 \. G
  18.         printf("Socket create failed.");
    + i( ^9 z5 b% s$ Z
  19.         exit(0);3 p* \4 u) n) P( J  p- j: W
  20.     }6 S! s+ {. y' z& \2 A
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);3 B6 c' j) s8 x9 X6 C
  22.     serveraddr.sin_family = AF_INET;
    - p7 `- q% D+ J( `, t
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000( J' Z# N& ], r* _& |& J, H8 l  M+ D
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));% k+ m( H5 E1 g7 F' [" @: r
  25.     char recvBuf[100];
    . u1 R; d6 P! e! o- ?
  26.     int len = sizeof(SOCKADDR);
    * s, y8 O. @- L8 Z4 U' _- ^8 z# q) h
  27.     listen(sockServer, 5);//5为等待连接数
    ' Z# u& q+ m$ K; D/ s0 X/ u
  28.     while (1){
    4 u" h  s- `0 P2 E4 U+ I! ~" o
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    % @2 z, |* B( D" l
  30.         //接收客户端数据3 _" u' B' z9 X
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    & o6 S# h4 o1 U4 K- A  }
  32.         printf("to me:%s\n",recvBuf);- G, m. Q3 p! N6 @- b
  33.         memset(recvBuf, 0, 100);% Q/ s, q$ p9 G9 T, B
  34.     }$ |! `( ?. X$ C! D  ^
  35.     closesocket(sockClient);) I1 g9 W) t+ r/ x9 T4 p( ^
  36.     system("pause");! T" }$ Q% R: G- Z8 F7 r! ~
  37.     return 0;3 c" E, k6 p- W7 _
  38. }
复制代码
客户端代码:" e4 m9 v, S6 ?  N9 p
  1. #include<winsock2.h>9 S$ ]5 M7 E$ |% G" s2 T
  2. #include<stdio.h>/ _) w0 `/ L4 ^
  3. #pragma comment(lib, "ws2_32.lib")9 U  z4 |' g% @  B( P! H, ~4 H8 ]7 I- @
  4. void main()3 U9 X/ ~  J: Y
  5. {
    7 l# C* ^4 g1 C" K
  6.     WSADATA wsaData;" H) y4 D6 O6 ]
  7.     SOCKET sockClient;//客户端Socket# F$ H6 u  x' z. D# c' i( \
  8.     SOCKADDR_IN addrServer;//服务端地址( v/ b' }6 T5 p  H+ U
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);: I- E4 ?4 n5 f6 {* l0 R
  10.     char message[20] = "HelloSocket!";
    - X, `# V& e# e; y# f* S
  11.     //定义要连接的服务端地址
    # y8 B7 k* d# A' u$ a& K; }  [
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ' E, X& A2 |/ i7 i2 j* n6 E
  13.     addrServer.sin_family = AF_INET;2 s8 s' Y. N8 x
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    9 U4 N; {+ F2 g8 J2 i0 a% o3 J
  15.     //新建客户端socket
    - H; k9 b/ [& h; i% @
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    0 [$ T2 \9 R# G
  17.     int s = 0;
    ) N0 O- x) X6 s$ ^* ~
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    8 ]  p$ A; |) o; z) s* W

  19. 2 n2 g+ ~. g; A8 n' \
  20.     while (1){
    & U4 C6 Z! d% k& D+ \+ U- d
  21.         //发送数据
    " {" K: L" ^4 a" J6 y- k
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ( v* T0 C* s7 V5 Y. r, j
  23.         printf("to server:");
    , _* R/ N6 y& y: @
  24.         scanf("%s", message);
    2 d, I1 o# J6 t  V" u
  25. 8 v# Z  Q7 P. [- p
  26.     }
    + b! w% B- P7 e
  27.     //关闭socket( U9 W* m- T7 B: V1 e1 W2 ?( d
  28.     closesocket(sockClient);  @3 Q4 E: A3 x: Q
  29.     WSACleanup();
    $ U3 C- |3 \4 ]- z3 q3 K% ~
  30. }
复制代码
求懂的高手来解答一下。% `" n4 Q8 J% a8 s6 y# B0 n% D0 `3 U
谢谢了!
% J1 W6 _6 T8 B0 B

/ b1 n: Z) r9 c
- H$ e6 i. L- I9 ^# q. s+ [+ J
2 q; \4 H( ~& }& f
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为, l) f' A0 W/ E' Z+ d6 a
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2