cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。" X4 _! I8 b! k* G. }& P
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 b' N3 R3 Z) {- l; `* |0 _% z
Talk is cheak , show me the code.
* ]( p9 \7 I) w服务端代码:
* C. L( _6 u7 p6 f( P3 x- M( K
  1. #include<stdlib.h>& K% A9 ^0 Y7 k! l8 ?5 ^0 a
  2. #include<WinSock2.h>* }* Q" |! Q' ?' w& K. T" R
  3. #pragma comment(lib,"ws2_32.lib")
    1 P" w1 z1 ]. u. ~3 H
  4. int main(){, Y$ K  K* k2 M( ]9 o0 h
  5.     WSADATA wsd;, I- j* v8 O0 `
  6.     SOCKET sockServer;; {; i; _$ w  `
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号2 _6 _9 h; _3 O
  8.     SOCKET sockClient;
    & z" [) X6 w/ }1 e
  9.     SOCKADDR_IN clientaddr;
    ( X4 w' v9 g( F/ _6 F0 b7 |7 ^( P5 b
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口; ^: g. V" `/ l" z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ; S, n; c( t$ {1 M
  12. ; |* F) K! m' C: d, t; ^! z

  13. " \) Z9 u- N  [3 s4 R7 \0 y' [5 X  Y
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){* t. f7 j; z3 V- D6 `
  15.         printf("Socket has been created :%d", sockServer);* c0 i$ |0 `, f4 B" i6 Y) Q6 Y
  16.     }
    6 m+ M6 R8 @/ i5 W! z' J
  17.     else{) r5 w. s2 \/ c" I# h
  18.         printf("Socket create failed.");
      K$ L  Y1 V0 c8 F" F
  19.         exit(0);
    + J* S2 x! k8 U6 S; X3 `
  20.     }
    $ v% }2 R5 m1 R/ Y3 }
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);- ]0 \1 Q& M! s
  22.     serveraddr.sin_family = AF_INET;9 n. G: l- W& M
  23.     serveraddr.sin_port = htons(6000);//绑定端口60002 S8 ~: u+ E1 k. G
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));/ H4 C" I% y' Z* E1 A+ C0 m: H
  25.     char recvBuf[100];) h/ h3 r7 v' i- N
  26.     int len = sizeof(SOCKADDR);/ G5 ?! A3 z2 ?! _7 s
  27.     listen(sockServer, 5);//5为等待连接数
    7 L8 r* P9 V& P  B7 r
  28.     while (1){- s1 P$ a, A! {5 S4 j
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " W- Q- [5 B* l
  30.         //接收客户端数据
    7 U# r% D, K3 J( ]
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);$ c9 @$ Z# P, N2 ~# ~
  32.         printf("to me:%s\n",recvBuf);6 z: p& k5 b5 }5 {+ ~( j' [( V9 L) K
  33.         memset(recvBuf, 0, 100);& U! a( T& ~& n# g" g
  34.     }
    8 t7 ~3 Z) z; k/ f( v6 M
  35.     closesocket(sockClient);
    / _/ E* s# Z: R
  36.     system("pause");. E  s" p8 A6 h* F
  37.     return 0;0 g% r  I3 c' |3 \( r' W
  38. }
复制代码
客户端代码:3 }" j2 n8 `% V) E/ B) Z, @% v7 z8 z
  1. #include<winsock2.h>
    6 T& h: ?, s) V8 j
  2. #include<stdio.h>
    - |6 a9 o) k, e, ?, }* A- G' `
  3. #pragma comment(lib, "ws2_32.lib")
    % G3 }* v6 _7 N3 N' R
  4. void main()2 l3 p$ p( j0 V/ e$ B
  5. {
    6 H# @! V! t3 n. l
  6.     WSADATA wsaData;2 ?% L, U1 L" j& |0 S/ t
  7.     SOCKET sockClient;//客户端Socket! H2 d' a) v1 ~" x4 U$ j9 `; g
  8.     SOCKADDR_IN addrServer;//服务端地址7 u+ M% q& F' T8 m4 ^# v
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);8 o5 x! o. I. U, M( a% _
  10.     char message[20] = "HelloSocket!";8 w- J3 H4 X) n6 V/ C
  11.     //定义要连接的服务端地址
    $ p# F, \8 g! v2 Z
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)  p! s; i* E: \5 q# k  w
  13.     addrServer.sin_family = AF_INET;
    . m# F4 @& N7 M0 o0 b+ ~8 o! s
  14.     addrServer.sin_port = htons(6000);//连接端口6000$ C- x( x2 v1 \; j6 L3 t
  15.     //新建客户端socket
    0 a- V( v2 T& P0 ]* x
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);- F/ H  Z* N( p5 ~+ \
  17.     int s = 0;0 U+ s; ?( C: T
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));) O- `% p" @8 v+ ]% \) N$ n
  19. 9 \$ l( k) T3 w7 J
  20.     while (1){$ R6 \' ?) S& F! L
  21.         //发送数据
    # b. y& b' n3 d5 g' G) w
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);( b) I( N2 x4 N- m
  23.         printf("to server:");2 d7 z1 O$ B- M/ `# u/ ]8 K
  24.         scanf("%s", message);
    # a) m1 U( o( @

  25. % d( V/ f5 A1 G
  26.     }
    1 Q, K5 C2 ~0 b- u
  27.     //关闭socket8 E1 \& Z( c9 Y% Z' i3 l7 m% C
  28.     closesocket(sockClient);
    $ A$ u% J6 @: O- C6 Z" }$ C
  29.     WSACleanup();: o! O2 b( p. x" i; a9 w
  30. }
复制代码
求懂的高手来解答一下。
+ F- u' Y% e4 x谢谢了!. p& `+ c3 p( K9 j0 g
8 O: g: R5 h7 ?; r/ {3 g

% ^4 D1 Y" n) N" d, t6 i# y/ k! c/ g' V8 U- D

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
7 h/ Y1 _' r& Srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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