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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10563|回复: 2
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
4 {6 N8 a2 H, c7 S5 t/ @6 C: R我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。& Q; G$ Y; i! Z5 L; E" Q6 S' L
Talk is cheak , show me the code.
  C! e% |' {! ~' [0 y. j5 M服务端代码:
* R6 ]! Q* y0 S7 R. Z8 ^
  1. #include<stdlib.h>7 q6 Q( }' n& v2 t- }
  2. #include<WinSock2.h>$ j7 t, k# D. @$ h* O  {' j
  3. #pragma comment(lib,"ws2_32.lib")
    ) I" n1 v6 S: m1 @0 R9 o0 H
  4. int main(){
    , A/ O- ~% d6 s/ Q, d
  5.     WSADATA wsd;0 U8 |2 Y3 X( ~: m& W* y$ x( Q
  6.     SOCKET sockServer;8 W) u7 H) L. P: ~4 w2 r6 ]. B
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号2 j8 H. l" d8 E
  8.     SOCKET sockClient;, k, f  }7 h& d
  9.     SOCKADDR_IN clientaddr;
    " k2 j' M+ N" f. B
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口' p. Z* ^' a+ {  s% A" ?5 R
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    $ ~; c1 }" G: S2 b  i5 f1 q
  12.   o; v; A& A; p. W% P
  13. + Q  c. `; l* e
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){9 U6 T1 r, W8 d+ X: K
  15.         printf("Socket has been created :%d", sockServer);/ z8 @% r3 F- E! |
  16.     }
    % {" G2 E" V9 i6 \
  17.     else{: B! f8 W: ^, I" Z
  18.         printf("Socket create failed.");) Z/ _; t  {  h
  19.         exit(0);# P/ h5 E* C3 Y+ ^- k% q! i; [
  20.     }
    ! M4 {4 E# G& m9 h% Q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);# `7 O: u8 Z# X* G# ]- n, Z) j) E
  22.     serveraddr.sin_family = AF_INET;
    4 ?, f! b& r5 `$ ~/ N
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    4 X9 K# w7 ~$ P+ X# y
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& ?6 f) h  y- z2 i+ U# I
  25.     char recvBuf[100];* D* a* M% L, \/ B/ h9 D0 r  l
  26.     int len = sizeof(SOCKADDR);6 Q' [! U7 G) c9 Y
  27.     listen(sockServer, 5);//5为等待连接数- k2 y- ^: C4 P1 r9 y: a: ]
  28.     while (1){4 b% [3 n% z8 n
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ' O0 k. t) Z& s; y! Q
  30.         //接收客户端数据
    2 u0 J& n  w" D$ t% i7 |3 I
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 G3 v* Q8 K# _7 _" K( P0 p
  32.         printf("to me:%s\n",recvBuf);3 q& Q5 B, N/ N3 ~; p/ q' J
  33.         memset(recvBuf, 0, 100);
    7 R, C; H" c8 H$ H" e+ k( M+ v
  34.     }
    ; Q9 G% F8 q( s8 h6 C
  35.     closesocket(sockClient);2 R! [% N; z( ]
  36.     system("pause");' N! p6 F, Y, v7 H' B  Q5 f
  37.     return 0;/ \2 W% ^# P4 J- m/ B" a  k/ N
  38. }
复制代码
客户端代码:, N1 p. F& z% [* P: b# H, S" M
  1. #include<winsock2.h>2 W# \+ h: ]) `4 x7 p4 ]
  2. #include<stdio.h>
    8 v/ D! O- s& E& H0 E( V& j$ r
  3. #pragma comment(lib, "ws2_32.lib")
    & R: @. n  q$ y* D. H/ @
  4. void main()4 U6 B) V& X  |: \
  5. {
    ' ~  W8 Q$ w% T/ i, h: L, H
  6.     WSADATA wsaData;
    # ^4 Z( y! \# v2 E3 ~! X9 |& h
  7.     SOCKET sockClient;//客户端Socket/ E7 N' D- f; C5 O* B: H, `
  8.     SOCKADDR_IN addrServer;//服务端地址
    % b6 g, |. l. ]' X7 ?* D. U0 j' D
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) f: F- z- d, q
  10.     char message[20] = "HelloSocket!";7 V6 I8 @; f! H* M" \9 N! T
  11.     //定义要连接的服务端地址
    4 p9 O* ^4 i, i9 n
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)1 ^/ W3 q" t; j9 M
  13.     addrServer.sin_family = AF_INET;/ L  r3 K( k. Z; X9 I; H% P- h
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . U. t8 C, U* {5 ]. S& G8 o. H( w
  15.     //新建客户端socket8 n! P) Q, Y: P1 O3 C( x0 i
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 _, r/ y% [9 m8 c! m/ P2 l
  17.     int s = 0;
    2 f5 L6 @) b! z" X  g4 X+ A1 o
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));! L- O$ m% p* F. |- H& \1 w$ Z: `  T

  19. 7 O$ q" B3 u7 _7 t0 X( ]% l
  20.     while (1){. f: b1 }  x3 h0 U
  21.         //发送数据  @% `) j2 W7 A  r5 Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);) O* N' Q+ X2 ?; f
  23.         printf("to server:");9 g- l4 z: ^5 G0 Q* v$ v/ n
  24.         scanf("%s", message);
    4 d1 ?. S; h4 s" j; c8 H* D8 g7 M

  25.   k" c, m5 n# I- k3 U  J2 `7 T0 k
  26.     }
    ' \+ b2 e; h) O8 ~$ d) V
  27.     //关闭socket
    : t+ q' [8 y$ V7 l
  28.     closesocket(sockClient);; |/ H- X5 u- S: @; g! j
  29.     WSACleanup();
    4 H7 t" H' a5 V: w2 y9 f7 q7 h$ S
  30. }
复制代码
求懂的高手来解答一下。
% z: }! {+ m) _& V( b谢谢了!4 b; c) Z: ~) t+ ~

  m2 x6 A4 s3 L8 @; X' w7 y' D9 V: t4 ^$ k

. x% n( p9 _' p9 C$ k/ @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为2 T/ H0 C6 E0 l: r) F( ]
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 22:58 , Processed in 0.113137 second(s), 18 queries .

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