cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
/ i* p9 G4 q5 m我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% h9 Z" r1 I7 O7 q, B) F8 yTalk is cheak , show me the code.1 ~9 p) d) K0 q* o! b
服务端代码:+ N5 y3 c( \6 `1 K: _/ p7 m( s7 Q
  1. #include<stdlib.h>9 _! ~' p2 V0 @8 o5 f' q/ S8 X
  2. #include<WinSock2.h>* T7 ^* G* o& Z9 a1 m' p
  3. #pragma comment(lib,"ws2_32.lib")
    % \' |) [6 R+ J" D
  4. int main(){# V3 S" S+ p$ a4 [# ~! G
  5.     WSADATA wsd;  g0 d) H" k: i/ w, D9 Y, R6 T
  6.     SOCKET sockServer;. N7 t+ T+ s8 s8 F5 A3 i$ ~6 f
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号9 N5 ~1 p7 e+ P6 i
  8.     SOCKET sockClient;8 F' g$ i% C3 k0 l5 z
  9.     SOCKADDR_IN clientaddr;
    : ~) r- f" l" {9 H9 l
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    2 }/ l0 j  g! o* Y. V# [& ?
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    1 a" t( M* h( a0 B' U4 h' |

  12. ) x. T% l) ~9 i! I  C  z
  13. # T* c: Y6 G& r: H0 Q) F# D
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    4 ]3 y$ g! m, R/ Z# a# q
  15.         printf("Socket has been created :%d", sockServer);
    : ?3 I1 \" @; [. @  m2 @
  16.     }
    , E' X( U  K% R7 Z/ T3 V3 ?; \
  17.     else{0 U6 {" _: ~' l  |+ `: o. t+ ]
  18.         printf("Socket create failed.");
    4 t: ?5 v6 k9 i& u1 S' a$ i$ ?$ e% ~
  19.         exit(0);
    # G3 D8 _+ S8 M3 h7 h) y& ?3 X
  20.     }
    # `4 ?5 b! q* \- ~& ^' k5 Y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);$ z7 Q6 t) O) [5 E
  22.     serveraddr.sin_family = AF_INET;  L0 |, j0 i( ?* v+ M" e3 X
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000( ]0 J% {! ~3 D, J
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    : G8 A/ s: ]: e# ?0 [) J9 F
  25.     char recvBuf[100];
    8 n) I' _9 T$ q) n1 S
  26.     int len = sizeof(SOCKADDR);6 H( u3 F$ w% S: t
  27.     listen(sockServer, 5);//5为等待连接数
    $ p( T) R+ B/ x! O
  28.     while (1){' p, p+ F& }8 {+ _
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 `7 N3 W+ d; D1 V
  30.         //接收客户端数据5 q- D$ L4 }3 W" B  y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    4 I( T, B3 g4 g0 T$ M' [
  32.         printf("to me:%s\n",recvBuf);
    5 g( G- f3 x0 w  h4 P( h( T" o
  33.         memset(recvBuf, 0, 100);6 B+ b& |/ Y* c. L4 ?* ?
  34.     }
    : w9 T" V" x' l3 ]1 D! p% ?+ p
  35.     closesocket(sockClient);' a# @# J. X9 V* e/ `
  36.     system("pause");
    ' W; v6 f% A8 V0 N$ {1 E
  37.     return 0;# W9 D  u9 Q) |/ T7 F
  38. }
复制代码
客户端代码:( T5 }/ n/ G3 f8 B. m$ G( g. H
  1. #include<winsock2.h>
    1 ~& Y, q. u1 K' }7 ]1 t
  2. #include<stdio.h>. T" Q2 s) r' @5 a: F* j9 s0 ~
  3. #pragma comment(lib, "ws2_32.lib")7 A/ f9 X8 S  ^# P' u  A
  4. void main()
    $ b& a) u8 s% r+ ^& {
  5. {2 b1 R# O: H1 y9 H& G, [* f/ \+ S
  6.     WSADATA wsaData;3 e% z  M+ R+ i3 X
  7.     SOCKET sockClient;//客户端Socket
      t4 }7 t1 g: F/ \
  8.     SOCKADDR_IN addrServer;//服务端地址0 |+ r( _( L' F0 D* T6 [
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);$ |4 m2 ?# u" r, p: Z2 ]
  10.     char message[20] = "HelloSocket!";
    9 J3 }# B" ?# i: i8 @- d9 P
  11.     //定义要连接的服务端地址8 e0 n, h* P- `/ D
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)4 a9 X, W1 b. B$ Q. w; s
  13.     addrServer.sin_family = AF_INET;, G( ]# R; R" m- [. o# L8 p
  14.     addrServer.sin_port = htons(6000);//连接端口60004 g) J6 [0 e5 \6 ]3 r6 ?
  15.     //新建客户端socket0 u. m8 i( w: _8 W- G" |
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    & {+ X% \& r' w( j
  17.     int s = 0;
    ' W) M9 O. U' I7 g
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ P2 T0 v, v: s" s0 ?9 I  Q: K' _: T- \
  19. 9 L+ p9 M, Q- W8 B: X( L' _
  20.     while (1){  C- p+ P  q% T$ C7 t
  21.         //发送数据; Y! F+ o+ O9 n' s; [
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);- y2 K7 J% v- c
  23.         printf("to server:");, R& `4 n7 a9 E1 {4 h9 F- U* c; ?% \* C
  24.         scanf("%s", message);
    * u( E. Q; B+ F3 T. n2 h5 x' ]* J

  25. ; r0 q* G! \9 S( O5 B5 V
  26.     }( P) u. ?! Y: L* B/ U- s1 a
  27.     //关闭socket
    # _6 r% T" Z( T& D. v
  28.     closesocket(sockClient);. ~$ N8 n% z2 A* G; f
  29.     WSACleanup();
    , ^& J, f$ n5 _3 P( Q
  30. }
复制代码
求懂的高手来解答一下。
8 b' ]' I4 B3 o) K( C5 |谢谢了!3 o  d& y3 t% Z- D  e

7 i8 ?" [( N1 F' x5 d- _3 X$ v

$ Q2 `1 {  i  ^6 t, t" e
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为/ N7 T( V2 K* k$ a4 Q+ c  g; k
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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