您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

C语言 socket 编写简单服务端客户端通信问题

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 15960| 评论数: 2|帖子模式

大家好,感谢你的回复。
  X( e) E7 J& E) @0 w我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。# ^. @. C: h! h6 v. D$ ^# q* f
Talk is cheak , show me the code.
9 b: m8 F2 M( y1 p  ^6 ^服务端代码:, V9 H8 _& K* d- \  A1 R
  1. #include<stdlib.h>
    - g/ k% R+ d! l, e4 b
  2. #include<WinSock2.h>6 o9 b$ ]4 i3 K& p
  3. #pragma comment(lib,"ws2_32.lib")
    3 G8 i& Q  Z9 W, A& L
  4. int main(){6 Y! F  S0 K! C& Z. r, H! b/ R' t
  5.     WSADATA wsd;
    1 `) |0 H7 b: T4 T( E* ?4 D! y
  6.     SOCKET sockServer;
    # H( w- P( I1 Q! S8 p! t' M; ]+ |
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号5 a# j1 z" X  n6 h8 \4 q
  8.     SOCKET sockClient;' g$ N7 X5 ]6 w
  9.     SOCKADDR_IN clientaddr;" X9 Q5 l! a+ ^- `* q4 a* S
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    " M7 D5 n% J2 U
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
      S3 N/ n1 }- \/ |

  12. 3 ^# b- ~" v$ \. t

  13. 8 L8 Z8 h& a# T! L
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){# ]! O  m3 p/ i
  15.         printf("Socket has been created :%d", sockServer);
    ' a7 t  U! _* }% Z' r  Z
  16.     }& u3 h; D/ a& u
  17.     else{: l! j0 r1 O4 C1 E9 u$ {
  18.         printf("Socket create failed.");
    # C" ~. Y# F3 t- Q8 O; ?3 R: ?; q
  19.         exit(0);+ J0 r) W" V- }% v/ K! H
  20.     }4 T$ c* f- y: g6 ^
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ) W8 Z7 |' l3 a4 a+ x2 f1 q% M
  22.     serveraddr.sin_family = AF_INET;, ^8 x' \" Y! K$ S- Z" K
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ) Z* y( N3 W& T& N/ ~& C7 U
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    3 S! z% H' ~8 F
  25.     char recvBuf[100];
    6 M4 M# ^/ ^5 z, l: b
  26.     int len = sizeof(SOCKADDR);
    . _+ L. q4 [  ~  ^# H
  27.     listen(sockServer, 5);//5为等待连接数2 x6 ]/ w6 g# e5 B0 G
  28.     while (1){& I1 ^" K" C: b1 {" t  ^0 H
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 R9 N. I0 n: L. w
  30.         //接收客户端数据
    ; G+ _, F2 `' L, V( E
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);+ e) C# P6 l3 @; Y0 j; M  {
  32.         printf("to me:%s\n",recvBuf);
    & a6 |; ~3 {' z+ ]
  33.         memset(recvBuf, 0, 100);- L/ c4 Y2 o( E$ X0 l- c
  34.     }. h; z# I% c% o
  35.     closesocket(sockClient);) I, u% q0 ?3 ?! R
  36.     system("pause");
    ) r4 b* P5 t2 s$ D- G, V0 M& S1 K
  37.     return 0;4 D- Q1 @  N1 w0 z2 L  x5 j
  38. }
复制代码
客户端代码:  n7 i, U# f/ T  T/ K
  1. #include<winsock2.h>) x7 U: E/ r! c) \4 k
  2. #include<stdio.h>! v& Y0 z' W7 }7 V0 w
  3. #pragma comment(lib, "ws2_32.lib")
    ) D. U% m! }1 b' |1 V, X
  4. void main()
    ' l) e' E* l; H. C) h  o, Y& S
  5. {* C( e# G6 w# X' f" J
  6.     WSADATA wsaData;, i' I1 K% Y0 S2 R' t/ u; o* t$ a
  7.     SOCKET sockClient;//客户端Socket
    0 S/ T/ U: q$ A5 L7 ]' f
  8.     SOCKADDR_IN addrServer;//服务端地址$ x" k: l7 B. W: o
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);; b* _; N% d( C# ]' ~: L6 A
  10.     char message[20] = "HelloSocket!";
    ( K1 C6 h- G, b- Y
  11.     //定义要连接的服务端地址) @+ \7 _! x6 S
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址), }& R3 ?& [" i! `
  13.     addrServer.sin_family = AF_INET;- q: ]% D: z- n. g- D$ m
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    # M7 a1 Q6 k1 p# r3 [' Q1 q
  15.     //新建客户端socket0 i. i0 r3 Y: T1 R7 X$ z
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);: F/ e  f0 u" E3 |" }* ^: ?
  17.     int s = 0;
    4 k6 |+ q2 ]$ w, n! X: t
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    5 M& I7 X' @, s3 d9 I6 g. D% i

  19. : u3 e3 A4 R( O
  20.     while (1){
      ]! F3 K& T! @& G
  21.         //发送数据
    6 o' x# N) b0 q; ~" ?  Y' x; q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. J6 m" u  C9 H; y
  23.         printf("to server:");
    8 \# r/ B! l6 Z
  24.         scanf("%s", message);6 M3 x5 r+ s( h$ Q* l

  25. + d% T; h" ]  U7 ~0 D, D' f) [) N' G
  26.     }# D! C' G/ x! ?$ V  G7 N
  27.     //关闭socket0 [& |" l; w5 d9 s7 K9 u% ~" `
  28.     closesocket(sockClient);
    : L$ B( Q: y3 n1 S
  29.     WSACleanup();
    7 {; t  e3 q  w: B/ c
  30. }
复制代码
求懂的高手来解答一下。
& J- Z* N7 W7 t& b4 [谢谢了!$ Q# i; a& b+ m7 J
! C% s  k. g& i! B3 ^  ^

+ x$ P+ C  P! E+ ^2 S4 ]# V/ v& p! D7 I6 D8 q+ K

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
% Z. p) Y* Q7 U' b, n7 ?( Lrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-3-17 16:02 , Processed in 0.046222 second(s), 20 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!