cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。& @3 X/ O( |2 f& I0 }+ W
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
  z. O) t: c% t& a* C6 @Talk is cheak , show me the code.: D+ H+ w* ^& w7 @& X
服务端代码:
2 r; R3 x- U% F
  1. #include<stdlib.h>
    5 X& U- W9 H9 ]$ P6 s
  2. #include<WinSock2.h>$ n+ [' O& G" e$ e# _% n, n! [
  3. #pragma comment(lib,"ws2_32.lib")8 z% m# m) i& s) `
  4. int main(){
    $ {1 x; X& G4 A4 B" W7 _
  5.     WSADATA wsd;
    7 L# K( S3 k/ G0 d$ \& o
  6.     SOCKET sockServer;! I. S) P" `. d9 J
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号8 s7 q5 d) j8 o; q' r4 T1 \
  8.     SOCKET sockClient;3 H4 I0 Q/ @) r- c0 Y
  9.     SOCKADDR_IN clientaddr;
    & M8 }1 C8 A3 C1 A$ {8 h  l$ w
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口( H) V2 O# f, T- ~- Z1 \5 h
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    0 ^$ d/ G$ R# o$ ^  j

  12. , Y9 F- w, r1 M

  13. " Q; S2 Q! a: _$ q5 u8 r1 I
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){' c/ n4 W2 C) L3 ~8 `. l
  15.         printf("Socket has been created :%d", sockServer);
    4 c' g! c1 Y! a2 b) |
  16.     }0 {, o: C9 g7 A
  17.     else{5 D1 Q3 K5 m. t+ U
  18.         printf("Socket create failed.");
    9 r6 E5 _( B! A4 {# ]$ B
  19.         exit(0);
    + s6 o' A1 y6 P- [; K
  20.     }
    " d  C1 H* t2 Q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);# @3 I$ G( ^) k3 B0 e0 i5 p
  22.     serveraddr.sin_family = AF_INET;( C$ j. b& E" \4 g; ~
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    & k/ z* H, M7 w4 F& I5 y$ Z
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    9 Y  s% w4 w4 H  A) ~( q- n
  25.     char recvBuf[100];6 U7 U8 O& T: s5 u! O3 R% R: r
  26.     int len = sizeof(SOCKADDR);6 l& g4 T/ _) I) O7 o- f$ X8 k
  27.     listen(sockServer, 5);//5为等待连接数
    . H2 i" i# w1 q( l) j4 ?
  28.     while (1){; g3 n! s' i* D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    , k& ^3 v. q0 B& d
  30.         //接收客户端数据
    $ n3 }) N& V# N+ g3 y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);! ]: S2 c5 w$ X& w; l" O# M8 n+ c
  32.         printf("to me:%s\n",recvBuf);, l4 Z7 q; j$ @# n
  33.         memset(recvBuf, 0, 100);/ e# I9 }, z( h1 {! q  a
  34.     }
    1 O8 A1 ?1 C1 P4 b
  35.     closesocket(sockClient);  k. A* Y( E" n0 X+ b# C% i
  36.     system("pause");
    1 n! _5 t8 y! K" h3 h
  37.     return 0;7 T# h  @8 N. y% }+ \8 z3 j
  38. }
复制代码
客户端代码:* O2 ]" c% A8 f% `
  1. #include<winsock2.h>
    ) T+ L$ h% t) L6 G; t: A
  2. #include<stdio.h>
    9 b6 P. g. `$ ?; C$ k9 s3 h: o
  3. #pragma comment(lib, "ws2_32.lib")
    ) w' a, b& Q5 c' a; ?, [5 t
  4. void main()
    7 P# c( ~8 A5 u, W" t2 {) G% |- p9 m- W0 t
  5. {% j3 ~& {- H, D5 c6 L
  6.     WSADATA wsaData;: p9 l3 ~. d3 P
  7.     SOCKET sockClient;//客户端Socket
      `3 t0 m0 v2 v0 U  ^3 S& o; A
  8.     SOCKADDR_IN addrServer;//服务端地址* d4 O  }4 M( b" H) {- Z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    + k- |$ G7 D2 l& t2 G. F, G' X
  10.     char message[20] = "HelloSocket!";
    3 n- U& ^( _/ ~2 w  O( a  N/ G$ r  p4 h
  11.     //定义要连接的服务端地址- b6 V$ T9 G5 H% Y5 c1 o
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)3 d7 J% t# ~2 V5 |7 `# }; w( D
  13.     addrServer.sin_family = AF_INET;
    ( k0 x  S; j+ W' u  ?
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    4 y8 S0 v; ?; v; m" k" ]: c
  15.     //新建客户端socket7 Z- L# x6 i% B/ I8 o  v5 f
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. K& o( z7 W, h
  17.     int s = 0;( `& K/ U+ r$ B; a
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    7 k. @, x2 M' L4 N# V
  19. 3 J5 Y* o6 o, e9 f
  20.     while (1){4 `5 @% k2 D( C" p; e6 ]+ F
  21.         //发送数据
    ; \/ d! O7 M3 z0 J+ q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);! o, V6 K1 D  m
  23.         printf("to server:");
    . e) H$ \: `9 O7 N( w/ @
  24.         scanf("%s", message);
    8 P. I  ]# @( t; K6 z) o! V
  25. : m  {! _% [4 C' ?
  26.     }
    + o* N. O& a; z( v' y, J# P9 M
  27.     //关闭socket, u1 b/ k/ T% B6 [, M
  28.     closesocket(sockClient);
    ( q* A3 N8 M6 s# K
  29.     WSACleanup();# F1 V, ]/ ?! A, v5 U
  30. }
复制代码
求懂的高手来解答一下。
: h% x. z) M7 q- y% @; I& p谢谢了!9 Z" q6 f7 `+ A8 h2 x+ [$ U
' z9 j. t; N7 M& K+ `- [( q
- [7 o7 N0 c- d. e% D0 Y& z; L, l
% c+ ?# u. L' O$ T# x5 {) R* m

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为, A/ B2 Z! X5 P2 j+ C# x0 i
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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