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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。
) ^# k' |$ j  R我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。5 |3 b. M9 r1 l% A' M
Talk is cheak , show me the code.$ p! @# f; s; [! q) d' w) d
服务端代码:1 z, z* G# J0 ?5 m7 x
  1. #include<stdlib.h>
    7 ]/ E/ q+ x/ O- W: o  [1 `9 Q
  2. #include<WinSock2.h>
    $ N3 I  ?2 Z( l
  3. #pragma comment(lib,"ws2_32.lib")
      H: t* b/ m( f  M
  4. int main(){9 \9 Z8 W( X- q+ |+ J- K
  5.     WSADATA wsd;8 u1 [2 o' b& i; V7 Z4 C, f
  6.     SOCKET sockServer;3 E4 \) d# W: u6 x( o2 ]
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    , b. l% ~) n- J" F1 ^+ n: z
  8.     SOCKET sockClient;
    ' T  Z' Q+ p7 j/ q1 p- k
  9.     SOCKADDR_IN clientaddr;5 @  t; T4 l; ~) |% y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ e& {9 l' S2 q
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: q6 _  |% X1 }$ H5 c! y6 W! S
  12. 4 _. l0 c( O/ R; n  k3 R

  13. " e* v9 u5 q0 s
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    2 i9 e/ p* ]/ Z- y) j
  15.         printf("Socket has been created :%d", sockServer);% N* ]) X* `5 B- U3 s1 N
  16.     }" Y" I! ~" i- \% x0 n; _
  17.     else{
    5 t8 D) B7 k8 c& j
  18.         printf("Socket create failed.");0 H! G9 {1 s% |* ]9 K3 g! K. i- Z' t5 z
  19.         exit(0);" {: x. ]" a3 @2 V  z( k
  20.     }3 L7 Y! B4 D' n1 G' @0 Z
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    " X! l2 A' _# [( m% N% H2 U3 p; ^
  22.     serveraddr.sin_family = AF_INET;) r2 m. o5 L0 T( j& b
  23.     serveraddr.sin_port = htons(6000);//绑定端口60004 z' S( m0 B2 g* P! t
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    + Q  F. v! D6 h# k' {
  25.     char recvBuf[100];
    , ~3 r5 L3 }; K
  26.     int len = sizeof(SOCKADDR);1 |) M$ E2 t0 u& Y" X" M5 ?
  27.     listen(sockServer, 5);//5为等待连接数+ S% l) F0 z+ s& d: b% H1 N
  28.     while (1){+ E/ s6 N- `# |( y! _0 `
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);9 _+ ^' i, |' V% U
  30.         //接收客户端数据
    7 h1 c; B! [3 C" r: n
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);; D# @7 b6 ~* K) y3 s2 c- `
  32.         printf("to me:%s\n",recvBuf);- e, F+ P7 R+ @' [5 l) x' F  O
  33.         memset(recvBuf, 0, 100);/ b, i) d1 V4 n; V+ c
  34.     }
    + e" S- q  w( D- T; I: g
  35.     closesocket(sockClient);
    2 j( x% d  E2 w* `) h
  36.     system("pause");3 S1 s+ x5 g3 A& ~5 F
  37.     return 0;$ S( C4 U9 F& d/ Q
  38. }
复制代码
客户端代码:
# Y5 w0 f1 S7 z7 H; w
  1. #include<winsock2.h>4 [/ g$ E& v+ z+ L2 ]6 ]9 n
  2. #include<stdio.h>: }. j: c+ L- B8 x7 h4 D! G
  3. #pragma comment(lib, "ws2_32.lib")
    ! ]: h1 L8 o& k' E. T, c
  4. void main()* `; D2 D9 z! `, Y8 p3 {
  5. {/ r1 p+ Z6 R" F; S5 }; A' g
  6.     WSADATA wsaData;, W: c, M9 p! k& `  {$ G: s# k7 R, K
  7.     SOCKET sockClient;//客户端Socket7 J' r3 W7 l+ U* ?
  8.     SOCKADDR_IN addrServer;//服务端地址* A3 r5 }8 e/ a, j9 x
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    5 z" U. P7 x  a' g
  10.     char message[20] = "HelloSocket!";
    & I: W, n: u1 G! W
  11.     //定义要连接的服务端地址: ~) i* h9 i5 H3 I# F+ C
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ! t) E1 K4 ]) W& l9 V4 _
  13.     addrServer.sin_family = AF_INET;: S: @5 P" i3 J1 U2 R9 K
  14.     addrServer.sin_port = htons(6000);//连接端口6000! S; I$ q- x/ B* T2 N9 {
  15.     //新建客户端socket$ B3 a) g2 y0 Q
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; E; A7 L9 l1 l0 }2 ^- Y' y% w( k2 m
  17.     int s = 0;9 M1 i1 Y* V( G; \. ^4 w( Y- T9 |/ y
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    $ Q, h) d, g% M0 b7 [; p. _: \6 d

  19. , A! l/ Y' j/ d! W6 ^4 G
  20.     while (1){
    4 S& R% l. T5 s8 @3 B. x7 _
  21.         //发送数据+ h# L$ v" Z1 F2 h( J/ q; R5 J. S
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);2 B0 o8 q: C! p) q
  23.         printf("to server:");! c- Q7 e3 y% j
  24.         scanf("%s", message);- H: Z& D' m9 X
  25. ) ?! t+ }- _0 {9 G
  26.     }
    ' X3 V; j% W+ l3 b* E# q
  27.     //关闭socket
    ; v9 b/ b7 Y; [8 e7 J3 ^
  28.     closesocket(sockClient);
      [9 l: K* p& `) A
  29.     WSACleanup();
    # `  Q, F8 l7 l5 c. d
  30. }
复制代码
求懂的高手来解答一下。
1 W/ n6 v8 W6 J; P; Q$ B谢谢了!) e+ o" O7 m2 ^4 `; [* r
+ H5 k+ A$ H8 D2 Z( m  K' ~$ g
7 m* \+ m, q& y: `, k  U7 A
  g' v' y2 B  x1 y4 N; T! k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
/ C: B: X! y: q- M# srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-9-29 06:19 , Processed in 0.119918 second(s), 21 queries .

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