cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。, }3 c5 {) Y" t3 z3 d
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。. _7 Q- l7 g1 W% ?6 @$ t
Talk is cheak , show me the code.
6 R( ~, a& ?( {服务端代码:
" o( U8 W8 j6 I) i9 O  b& `7 ~
  1. #include<stdlib.h>9 N" W" {1 i% N: Z  @! U1 k- w
  2. #include<WinSock2.h>
    " \0 V, J2 p; n0 [! l' n) v3 h  d
  3. #pragma comment(lib,"ws2_32.lib")% L  ?7 |, E, l9 k. I
  4. int main(){
    7 G$ i  @8 x; P' c$ E
  5.     WSADATA wsd;
    * F8 S% ^& ^8 P  o. S
  6.     SOCKET sockServer;7 m  k# H! A0 X
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号: ^2 e' _0 j6 N5 v
  8.     SOCKET sockClient;
    * G7 |+ L2 a8 K" G
  9.     SOCKADDR_IN clientaddr;
    ( h  d; X/ Z; ]
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 ?+ M% W% }0 [; r
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 ^5 u6 d' y3 t( W+ m
  12. 2 E# W( b4 U3 Z. W  Y  s2 p# g* H. \  G; ^
  13. + p2 `( ^# D  X  l' @
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){" r. v" r6 s9 I5 R7 }# y5 {
  15.         printf("Socket has been created :%d", sockServer);% B5 L$ `* }0 n
  16.     }3 z7 T# y9 j" s$ i5 i0 Y0 F4 U
  17.     else{; {: ~7 J# C  N2 P  h* R& @
  18.         printf("Socket create failed.");
    / l& F  o% m, e8 L# ^) `1 w
  19.         exit(0);9 f- @# j$ ^- ~! y/ J9 [$ S
  20.     }+ M( v4 L9 J; q8 t
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ) S  s4 `7 j1 Z( D  h
  22.     serveraddr.sin_family = AF_INET;
    , N' F' f+ r7 a0 v
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    . G. l$ a! L+ I5 ]" t- x
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));4 x7 X% n' D; y
  25.     char recvBuf[100];
    $ ~( @0 q8 ?0 x% V; B9 W/ z" B
  26.     int len = sizeof(SOCKADDR);
    - B" @- a" }9 K- t8 f
  27.     listen(sockServer, 5);//5为等待连接数  K, X0 f6 s/ g5 n
  28.     while (1){$ L7 C4 r+ R. z: b; L* E
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);, U+ F+ _; K8 w8 j. O; F
  30.         //接收客户端数据
    9 Y1 G# [; l& e- w- u0 M
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ! H) ]. |  O& r% h- T4 q
  32.         printf("to me:%s\n",recvBuf);. F  y7 U; u/ H/ I
  33.         memset(recvBuf, 0, 100);; [; N" V4 ~$ }* w/ o
  34.     }
    6 R! B1 @5 U1 }+ A' \0 S8 R6 W
  35.     closesocket(sockClient);/ m+ j7 x; I8 P: p- E
  36.     system("pause");
    4 i# R- q. W+ q4 L, U( Z
  37.     return 0;- D2 S2 w8 T  z9 Q3 B2 m: Z
  38. }
复制代码
客户端代码:
" Z9 U0 L3 F3 m9 f' Z
  1. #include<winsock2.h>
    4 [  O* g& Q" [. i) ~" Q
  2. #include<stdio.h>
    & L% b4 t+ \( C+ m+ H
  3. #pragma comment(lib, "ws2_32.lib")% t  t! k* ~. g0 y
  4. void main()
    3 Y0 I- }; P# P5 f/ A
  5. {% J) P/ A5 w  m8 G; L6 v% Q6 Q
  6.     WSADATA wsaData;3 O- \  F0 k' L
  7.     SOCKET sockClient;//客户端Socket
    $ j; r+ e  p* e& D* g4 ?- \
  8.     SOCKADDR_IN addrServer;//服务端地址+ P7 j; r. J2 v3 t- W# z& t
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    . ^  n8 V. S& e! i  C" p  @$ g
  10.     char message[20] = "HelloSocket!";( N9 u" Z2 y7 n# v
  11.     //定义要连接的服务端地址7 \) j7 [' q# t! ~" H( i: J  v' M  y
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    0 L  V( t/ Q6 F1 k* l9 k
  13.     addrServer.sin_family = AF_INET;
    5 e) ~( w* A( q/ y
  14.     addrServer.sin_port = htons(6000);//连接端口6000, i; w5 g% Z% I8 v+ ^  ?
  15.     //新建客户端socket4 w( {3 c, G5 p; X7 ^5 J
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    . Q: s( y$ D! M
  17.     int s = 0;
    * u3 H. @4 G3 E
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
      h) I3 ]' x" u' ?! I5 O
  19.   V, y4 C4 L& s* ~! N
  20.     while (1){5 u7 `. ?) {& [6 d
  21.         //发送数据$ w& _$ V' u* y3 ]. M) o  F1 n% [
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    / o, g; D5 @6 Q8 F* k/ e: A2 [
  23.         printf("to server:");. Z2 {# w) l+ @- P! }2 C8 {: p
  24.         scanf("%s", message);5 N. N0 c2 z/ J9 a+ \" C
  25. . m7 m/ D# Z# m" ]. X
  26.     }! _  x; u* u$ U0 T& p# ]3 t
  27.     //关闭socket# ?9 V6 f1 ?1 u8 i; m1 ]
  28.     closesocket(sockClient);
    4 L9 n, b. h# G, M8 q: q+ u" H$ L
  29.     WSACleanup();6 G  k6 T- X3 D! c2 [3 {* u' X! ?' |
  30. }
复制代码
求懂的高手来解答一下。
! o8 n3 Q  o) F谢谢了!/ l# M7 i$ ~: B2 B4 P6 ]
7 c  a& ?$ T( B" o
, w! }8 }# p/ b8 G
: O" r! r# i# @# q( f, Q8 c) d

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为$ N9 ?( ~! i' ]" j% K
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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