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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。( a+ Q; T9 z3 a; I! t9 T1 n
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; U' A5 L4 `% @  tTalk is cheak , show me the code.
# w  `2 t, V' w8 x' X- E服务端代码:  y0 ~: W3 I1 @
  1. #include<stdlib.h>
    : E5 a2 v8 d2 O, d0 g% u3 k
  2. #include<WinSock2.h>
    ) H+ B( K! g0 a1 y( N" e
  3. #pragma comment(lib,"ws2_32.lib")
    2 _* ~5 H- @% f
  4. int main(){. P! k. P2 m; J: g' `3 {
  5.     WSADATA wsd;
    1 k! V& v' H6 i' K% C9 s- r
  6.     SOCKET sockServer;
    & ?( j" e9 c+ d8 K$ ]0 z( `
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    & X/ h% ^+ x# r- s
  8.     SOCKET sockClient;% g1 K4 S+ d7 |0 z0 x7 ~6 i/ w. ]
  9.     SOCKADDR_IN clientaddr;2 N  N* _, ?, O
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口6 `# B# d! y0 R7 M
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    / V7 I: B0 P) Q4 C0 d/ C2 q
  12. 8 l( v4 |% L7 }7 F
  13. : ~; P, B8 c, _2 ]
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ! o0 B$ o9 g3 P7 y
  15.         printf("Socket has been created :%d", sockServer);
    ; Y) m/ H; l1 K
  16.     }8 `3 {1 k! _* C
  17.     else{5 Y, H1 `; r/ O% E8 T+ p
  18.         printf("Socket create failed.");
    ' o/ }- n/ e; J% A/ F; \" i
  19.         exit(0);
    4 B- o1 {5 c" @; f9 n
  20.     }
    ; E1 Q9 b3 H6 w  U, D$ G
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    $ ^: M: t* N9 b. `* o3 _, u
  22.     serveraddr.sin_family = AF_INET;
    2 W4 g. |& l- u  U2 l6 ?1 c4 X8 u
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * k' [8 K* f3 G7 a8 _4 M5 G  F
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    % f# R, J! j6 e" J
  25.     char recvBuf[100];
    * I9 ?4 A+ c3 Q) c  p6 [
  26.     int len = sizeof(SOCKADDR);
    0 y& P  U3 z) U( z# Q+ o6 Y
  27.     listen(sockServer, 5);//5为等待连接数
    ! Z* c. W/ k8 G$ j3 B+ [
  28.     while (1){% [3 B5 F- X7 k( F* x: H% ^2 I
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    1 D( R0 T9 i# F
  30.         //接收客户端数据
    ! u' R. B9 B. e+ n! g% b0 C
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    5 R) a9 y6 g% ?6 }/ G3 m
  32.         printf("to me:%s\n",recvBuf);! G) |3 t& M) d* Z
  33.         memset(recvBuf, 0, 100);
    , c4 d4 A6 v) Q6 h. }' \: p
  34.     }
    $ V7 T, A8 j6 S% `/ U& f% g
  35.     closesocket(sockClient);# i/ B8 h+ W* |2 i+ c
  36.     system("pause");. n5 v9 d" g6 ]
  37.     return 0;1 K* O/ C0 O2 ^
  38. }
复制代码
客户端代码:
) a2 V$ a& z1 r+ h2 Y- v
  1. #include<winsock2.h>
    & p4 X( y# N2 Z5 M  f
  2. #include<stdio.h>
    ) o. D, Y, E$ m$ M+ I
  3. #pragma comment(lib, "ws2_32.lib")' X* D) t( e" i* L" i1 W
  4. void main()
    5 K. P. A3 @& v5 Y% \( X
  5. {
    9 C6 l! Y8 Q5 y" |. K" x
  6.     WSADATA wsaData;
    7 \% q" Z  |* m! J( c- }' l
  7.     SOCKET sockClient;//客户端Socket6 q* Z, V1 Z% x7 V* ?6 W7 d
  8.     SOCKADDR_IN addrServer;//服务端地址
    8 L- o& X4 M' S( s; W3 I
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    2 J6 }, S) i  h4 b6 }
  10.     char message[20] = "HelloSocket!";8 s  j6 }- d$ {3 N
  11.     //定义要连接的服务端地址
    3 d# l- T& [' C, H1 U! q% ^: q
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)2 _7 i; g/ J% a1 a7 M' i
  13.     addrServer.sin_family = AF_INET;
      a9 M/ M0 ]! R5 B5 a$ ]( W$ g! U
  14.     addrServer.sin_port = htons(6000);//连接端口6000+ V+ [# N5 ^6 ]- g$ G
  15.     //新建客户端socket
      H0 D/ t# E3 i
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* I2 S! s/ X$ ]; m  x9 x/ d
  17.     int s = 0;
    % O) I/ {% U8 |7 {/ A/ g: |! M3 e
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));1 O4 |% H: U6 o' m' x& v
  19. ' P  ^2 ]/ q7 x/ O! H" h  t. t
  20.     while (1){
    $ \9 \7 s, F$ ~! F( q( t5 D
  21.         //发送数据
    ! g* _8 t9 L- k+ f& x2 [; e$ }
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);/ l, m5 m- S) B( }0 y  p, i! w
  23.         printf("to server:");
    * F0 N# V1 g1 ]! A7 m! }
  24.         scanf("%s", message);  A7 D' h6 M# J8 n' D+ o0 Z

  25. 3 M0 V" X/ u# X7 ~0 p
  26.     }$ b  D% K4 K( \9 h7 U
  27.     //关闭socket; `! c6 F  g$ {
  28.     closesocket(sockClient);# H- @& Z, V( l" a7 i* {3 {
  29.     WSACleanup();
    ; W  L* s% U5 r4 z8 o/ |
  30. }
复制代码
求懂的高手来解答一下。& X6 B8 ?- {* ]) r. O
谢谢了!8 |8 V9 s% ~  B: N. W

. w" t3 I# ]8 U8 ]1 Z, v6 c( o& V7 w9 m7 Y3 }7 t
% Q* E0 S0 F' `; X* c1 ?- C% ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
" G9 J1 Q+ E1 [1 F$ P& z  {7 x; ]recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 14:06 , Processed in 0.053079 second(s), 18 queries .

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