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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。9 N) X. w3 V+ k: X: h  O9 |
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 x0 |) [( Z8 iTalk is cheak , show me the code." M2 J5 E4 f" A( T' X9 m5 d/ ]) d
服务端代码:8 ^# ^7 D& ?7 z  e
  1. #include<stdlib.h>
    7 G  f. a: E7 H# Q  h0 o5 x1 y0 O% @
  2. #include<WinSock2.h>" r" E- x! }: ^
  3. #pragma comment(lib,"ws2_32.lib")
    7 C7 _. e- [( |, a# N
  4. int main(){/ g" u) H( S+ n5 h9 h0 E, x
  5.     WSADATA wsd;0 K- J! E0 I' |5 P; d0 _5 T) ~( d
  6.     SOCKET sockServer;/ Y; I* _+ ~, p0 c1 ?  K+ \
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号# F8 w3 T: ]" Y3 w* `. E% i3 T; x
  8.     SOCKET sockClient;
    ) F8 S8 w0 I) ^$ k
  9.     SOCKADDR_IN clientaddr;
      B$ D/ H4 a' [  T3 f
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* f( a  W+ P+ \& A8 x- s3 ~
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    8 a/ J5 x- c: e7 r# S" Q$ l: p9 Q
  12. & _* [3 m9 e5 a0 z: e
  13. ; [+ L8 b) k. _$ c' q# R) c! x9 @" O! O
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){: a# S$ r' s+ j4 _( L' g1 @
  15.         printf("Socket has been created :%d", sockServer);- ?+ V* i# v8 G+ q/ C1 T9 ?
  16.     }/ ?0 \# ~' L' e  i  N' c
  17.     else{) k9 e+ q* ^4 j
  18.         printf("Socket create failed.");7 f9 S4 C2 L5 ?' v8 C9 E" j6 |. R/ y$ B' T
  19.         exit(0);
      [0 p1 J0 S. U: t  I
  20.     }
    , B- d( s! c7 n% N  h
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);2 p, g( O! P4 t, k. N3 i6 e: T
  22.     serveraddr.sin_family = AF_INET;3 s: x0 G- i/ d+ U
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000: {7 c. [) K6 r$ ?
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" Z: g' G5 {5 N8 P: i
  25.     char recvBuf[100];
    " U) T8 u3 D) o6 _
  26.     int len = sizeof(SOCKADDR);  U" T) A, A& e6 n
  27.     listen(sockServer, 5);//5为等待连接数$ }! D3 i# D9 W* k$ N- F  i4 b8 v
  28.     while (1){
    % O6 z9 J3 q( X
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    7 X8 l% ]# r- n& J% u% T. e8 f& f% B
  30.         //接收客户端数据
    1 r7 ]7 J( y8 H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ( ^7 O* e2 }- e% Q% |4 P7 ~
  32.         printf("to me:%s\n",recvBuf);
    4 U+ V3 U  O8 I
  33.         memset(recvBuf, 0, 100);
    + {5 I. r& ]' d$ L
  34.     }+ U; ]# U: {6 s# }
  35.     closesocket(sockClient);- {9 J0 x7 e  ~! p! @& u$ a
  36.     system("pause");$ E. {+ `$ l0 a+ j0 u$ ~
  37.     return 0;
    3 T( J' t, ~2 k$ H+ B$ C
  38. }
复制代码
客户端代码:
, A* e+ s1 ?' D3 `
  1. #include<winsock2.h>4 ^( E2 ^' g1 M4 G/ I% [/ m1 J
  2. #include<stdio.h>3 ?" |' d/ M* l, |
  3. #pragma comment(lib, "ws2_32.lib")1 f, u( n/ M$ U7 \, y
  4. void main()3 U+ M1 {6 L5 J8 h( d
  5. {% _& b8 M8 ^8 S3 T
  6.     WSADATA wsaData;2 r/ D* M* i7 X% w% k% @
  7.     SOCKET sockClient;//客户端Socket
    6 A( w3 I4 L8 n7 ~" r; y1 {
  8.     SOCKADDR_IN addrServer;//服务端地址
    2 ?% g% C" G2 d- v# Y+ G
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    9 Z/ m& [& c* }' V& y% A9 [
  10.     char message[20] = "HelloSocket!";
    $ m+ N* b. e, W. N( F8 ]" C
  11.     //定义要连接的服务端地址: }0 M2 Z( P- C; l( l, V
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    1 D) |( f% T1 u2 G
  13.     addrServer.sin_family = AF_INET;
    9 W7 S$ `4 v1 m4 z, w2 C; W0 V7 d
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    3 k! v2 a0 R& l! J' B
  15.     //新建客户端socket6 q: _- e2 E+ [/ B- d
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; m' T: f* U8 {6 _
  17.     int s = 0;  v8 H* T6 B2 V+ A
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));1 p+ n4 `% O0 w/ r

  19. ( c- \; g2 K& [  C1 x
  20.     while (1){  m: v2 I+ }7 M, F5 H# `
  21.         //发送数据+ c+ V0 K) v4 O9 ?8 x2 J
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);1 h+ T! V: j6 g7 J! ?
  23.         printf("to server:");( u- O; S! F  q8 Q: I4 ^
  24.         scanf("%s", message);) V6 b, P% q& W9 p

  25. # `; w7 Z  B: l7 j) f, n
  26.     }
    ( r$ A1 X* F$ L1 I+ B
  27.     //关闭socket5 c& `: \; |& |
  28.     closesocket(sockClient);
    1 [! [2 i! |* k& u  V
  29.     WSACleanup();- N6 W  K$ N" d3 D
  30. }
复制代码
求懂的高手来解答一下。, h8 ~8 u$ G  W, x
谢谢了!1 U2 i' Y8 W# Q/ t6 ?7 O  J

% p& G& v% d: _3 @4 c# G
. `& D" Y& t! e( g; o
8 |: }+ A# Z/ \# a2 G) t8 B$ V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# T) T0 k/ ?# D( j' O) c9 wrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 14:34 , Processed in 0.050031 second(s), 19 queries .

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