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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。3 ~+ _" z0 A4 \
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
& ^- i' z) x, b# d- zTalk is cheak , show me the code.6 N0 K/ I2 a( A" {+ C
服务端代码:
; }2 g* g8 }! u6 D8 S& b
  1. #include<stdlib.h>% I7 A& l4 H$ M6 G% @/ z) I8 |2 K
  2. #include<WinSock2.h>
    / ^7 X9 Y7 r+ E7 u+ r
  3. #pragma comment(lib,"ws2_32.lib")8 E9 |% i1 V% l# y1 P$ y* Y
  4. int main(){4 T' C  n  S, y
  5.     WSADATA wsd;# {6 S0 S, q  ]+ l0 G
  6.     SOCKET sockServer;$ w2 @& I& j3 J& Y( w0 p2 Y
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号; @. p4 |/ m7 r5 R9 h
  8.     SOCKET sockClient;
      C' C3 `4 @8 @3 ?" V
  9.     SOCKADDR_IN clientaddr;! ~) H( Y; }3 g/ U
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    2 E4 P6 k8 {) ?0 Y% P) n
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
      s& y7 u! V4 R2 r

  12. # f2 W- @, U7 R: ~" I: a5 x
  13. 4 j. J/ u- e  Q  k7 Z" F) c3 k, D
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    $ n0 `# G' O6 ^5 Q% [1 j$ Z
  15.         printf("Socket has been created :%d", sockServer);" r/ [& u5 P9 s
  16.     }5 ]# I4 s" A" u* t
  17.     else{
    3 H8 k; P6 g6 t8 ~- l( _$ @
  18.         printf("Socket create failed.");
    9 H/ \& Q& W/ A% J- g) j  \9 M
  19.         exit(0);) \' u0 r0 p) N1 |
  20.     }# z  F' o4 I9 }* d& T
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);: K; A4 L5 W0 M7 r% f2 K% t8 s
  22.     serveraddr.sin_family = AF_INET;1 {" L3 |9 y1 N- Z
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    6 f- w) r$ I/ k+ e2 [2 J2 A
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));, U# h- G0 F2 w5 r, o
  25.     char recvBuf[100];
    " G, f; I0 g, ~* M: E: F$ }
  26.     int len = sizeof(SOCKADDR);$ |. \- |9 g% H& s
  27.     listen(sockServer, 5);//5为等待连接数# d3 t) n6 h# ~: a0 L
  28.     while (1){0 x" @1 ^3 Q- ^1 c& _
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    3 d' a6 {6 V+ \% x
  30.         //接收客户端数据
    ' @4 ^: o' Y5 M4 L+ K: L
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- G' i5 y+ o: _/ f
  32.         printf("to me:%s\n",recvBuf);
    / U3 K/ O+ @" H$ A" R2 E5 E
  33.         memset(recvBuf, 0, 100);. d% ~# y: c4 @% _
  34.     }
    1 k- B7 v# |  Y2 a" l% w: U" T; l9 B
  35.     closesocket(sockClient);
    . A7 k" R& Q) q8 ?- \& @
  36.     system("pause");  K4 e1 o1 m* K, K1 N% a
  37.     return 0;/ T9 U7 R2 n' ^1 j4 F2 U. T
  38. }
复制代码
客户端代码:
: `5 O; \; g/ O7 O. o2 Y0 A+ C% `; O
  1. #include<winsock2.h>
    5 L6 [) W: d1 U4 c
  2. #include<stdio.h>  s! z- l/ `6 n0 E3 O( k6 |2 i
  3. #pragma comment(lib, "ws2_32.lib")$ f8 Q  p& D8 p* \
  4. void main()7 L+ s0 N9 {/ ]1 c. j* e1 V0 s
  5. {
    3 H" ^/ g; |& z6 X0 S
  6.     WSADATA wsaData;
    - n# ?$ ~7 ~9 J6 }$ n  l1 N; k
  7.     SOCKET sockClient;//客户端Socket4 Z  ^) Y/ H% V
  8.     SOCKADDR_IN addrServer;//服务端地址
    5 r, r6 V  d7 O% f
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) `' Y. b) @6 Q
  10.     char message[20] = "HelloSocket!";
    : i$ J# e6 v( h
  11.     //定义要连接的服务端地址, t( @  f+ {  i: E8 d  }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    . h7 \  i! ?8 L+ Q: N# L
  13.     addrServer.sin_family = AF_INET;
    ; H/ d) W2 M/ s, @
  14.     addrServer.sin_port = htons(6000);//连接端口60002 i) f3 K; ?: N$ w0 k) Z: j- g( m2 @
  15.     //新建客户端socket
    $ s, w5 t( J3 }- c% n6 r
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);! [7 b! ]8 s+ O
  17.     int s = 0;2 J5 J0 P/ k4 H6 S, I7 L: s6 n( w- T
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    / m% G7 L' \: M7 `9 H* K! w% A
  19. ' Z) V3 T; b+ r/ ]
  20.     while (1){
    3 D( d% }$ U# S  S
  21.         //发送数据( V( ^! B' s% h# V; R; q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ! ?# j/ z1 n, j* J6 A
  23.         printf("to server:");- c- O  m+ G7 }3 T* |
  24.         scanf("%s", message);
    6 \$ N3 g. i% E
  25. , C; R* Y' v- J% Q+ k! `; A) o7 B
  26.     }" V" ]; @" @+ h$ b/ P- d) x
  27.     //关闭socket* e/ H" P4 w7 {8 p* \7 E& @7 p% r
  28.     closesocket(sockClient);
    . u4 z+ J! Q, O' Q
  29.     WSACleanup();
    ; ], g; R: x) A% c- ~
  30. }
复制代码
求懂的高手来解答一下。
2 }3 h9 D5 W& O, @谢谢了!9 a& A2 |3 M# ^
9 k. A+ i* y5 c2 l
+ d. e# `$ e! o; u7 X

( ~8 f1 W, q" o. e5 N# L. u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
, b6 s! R  ?9 b. ?6 drecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 03:19 , Processed in 0.051143 second(s), 18 queries .

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