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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
3 S& \$ g0 K; n8 p! v; J- F我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
/ ^# R5 _. p% Z6 q6 hTalk is cheak , show me the code.1 ?3 g1 c3 A2 H: D9 ^
服务端代码:
3 A0 S- w1 j& V
  1. #include<stdlib.h>
    + h# N  M0 x" e( Z- s
  2. #include<WinSock2.h>
    : u  x2 J( S/ }) j
  3. #pragma comment(lib,"ws2_32.lib")
    / M- \/ k* |+ y: J. I
  4. int main(){  Z. O4 O+ O  f* i7 h4 l9 j5 Q
  5.     WSADATA wsd;
    # b' _- g! H) k0 K- ^/ b2 i* K7 q
  6.     SOCKET sockServer;
    ' E5 L; b- z" C
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号$ j' t& o9 w/ |' t" p4 j% M, m
  8.     SOCKET sockClient;9 r/ U0 O5 m6 ~+ Y9 W. `  ?
  9.     SOCKADDR_IN clientaddr;
    2 v2 G8 f. G! D1 X( m$ G; t
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    # C! y. L4 x( d; E
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket2 b) ~# w# ~$ G2 [1 G. u

  12. 3 b* U& }: W) V9 z
  13. 0 A1 H$ L+ R; i, y/ R2 \$ L
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    : o  P6 c; L# x3 J- R
  15.         printf("Socket has been created :%d", sockServer);
    ) s( o/ H, I& F9 o, B6 ~' F
  16.     }0 o# a( B6 ]5 H
  17.     else{$ O, Z. f  N$ E& }7 S- y
  18.         printf("Socket create failed.");
    - n. `/ _# ^3 i0 X
  19.         exit(0);) {# i. t4 }! S) m5 Q* W2 V+ F
  20.     }
    # s2 t, f. G& G7 C, S4 j4 G. v3 F3 [4 \
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/ t1 U! `/ B1 [, }
  22.     serveraddr.sin_family = AF_INET;0 V+ P# X$ Q3 u% Q8 E( t, g
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000- J1 Y# j. A5 i4 Y4 r; g9 i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    + r: R: |- H8 T; j* Y
  25.     char recvBuf[100];
    0 q" m+ d" E3 s/ y
  26.     int len = sizeof(SOCKADDR);) H8 C3 E$ A. M( y/ \) i  @
  27.     listen(sockServer, 5);//5为等待连接数% {  `# \8 q+ Z* O
  28.     while (1){
    ; i# t+ _) u% D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ; l: Q! `5 l8 \5 c" W3 U# [3 ]
  30.         //接收客户端数据/ t8 B9 i" {8 c. O+ k6 K. ?* o: y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ) C% a. ~7 D2 s& Y7 ?- D2 Y
  32.         printf("to me:%s\n",recvBuf);  V( `% r4 m4 J
  33.         memset(recvBuf, 0, 100);0 F3 S; w! f' o5 c: ~: M% q' \
  34.     }
    / S) T. Q  i9 Q/ `" V) ?4 m4 L) v
  35.     closesocket(sockClient);& y+ d4 }1 ]4 M6 e2 y5 ~
  36.     system("pause");' I/ `' ~/ B7 J# w6 s
  37.     return 0;) d( C6 z, X& J4 N7 E- h3 R
  38. }
复制代码
客户端代码:% p$ Q& u, |8 G8 M( E
  1. #include<winsock2.h>6 O) k* s" D) A& Y
  2. #include<stdio.h># Q8 g0 g1 u: O
  3. #pragma comment(lib, "ws2_32.lib")
    ( p$ y. S* `7 G7 H$ W) V
  4. void main()7 g$ `6 ~6 O4 \" G
  5. {
    9 v4 S6 @* g: |0 a" c( p/ G
  6.     WSADATA wsaData;9 `' H, Q. x8 m/ i+ F
  7.     SOCKET sockClient;//客户端Socket
    1 }* }; Y7 c0 `: L. }$ ~) _
  8.     SOCKADDR_IN addrServer;//服务端地址/ @2 J: s5 |1 V7 \3 @2 v+ F
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    8 v' W7 Z+ e  C9 `6 F
  10.     char message[20] = "HelloSocket!";
    ) S+ v5 n3 \/ u  ], H* g' [6 k
  11.     //定义要连接的服务端地址
    6 v( o2 _2 I; `5 |, K* L
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址); v2 k/ e! c' z/ ]
  13.     addrServer.sin_family = AF_INET;
    0 O3 |1 v0 B& U
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    2 J% W; e1 a1 V) ~
  15.     //新建客户端socket
    . \4 ^3 J+ M( r5 `
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; k! |2 k& y1 A0 k( B9 I
  17.     int s = 0;
    6 {, X6 s" f! v% w& ]
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    * x' n) N7 k2 p. s) Q# T- C
  19. 0 W* y) Y2 k& E. w2 X' Z- s; u7 [
  20.     while (1){6 o, f9 c6 [1 F7 J' S# i. e
  21.         //发送数据% r9 x7 z6 p, C5 z. w
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);/ a5 T" M; @1 v0 F; ~# q
  23.         printf("to server:");
    8 q$ u  B* o; q) G3 s2 U0 D* `
  24.         scanf("%s", message);
    # \6 D6 J5 z  R2 V5 K" s
  25. ( J" m; I6 S) N8 V& N
  26.     }
    6 y  o" d$ T$ ?, E
  27.     //关闭socket
    ; {8 Z/ C7 P. K+ v; H7 J
  28.     closesocket(sockClient);  E  r+ z# ~+ X  [2 z& u% V7 \
  29.     WSACleanup();; i: Q0 u: \, g) c5 J; q
  30. }
复制代码
求懂的高手来解答一下。. \  k2 O3 }4 s! ?* s. l
谢谢了!+ a. X9 m7 v8 {* \) D8 L6 |& {
0 O: T3 @* d: }( j
0 ?& A6 Y( v. }  r

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

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
5 r. L& c+ u8 ?$ jrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-17 16:06 , Processed in 0.053468 second(s), 18 queries .

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