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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
, @# C$ D* a) `  x我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, U) l* x7 o( z7 XTalk is cheak , show me the code.* ]; E! Y  E( Q$ A  H! \
服务端代码:
3 z* L2 W6 |8 V. M4 ~/ ]+ a
  1. #include<stdlib.h>0 y: e6 q' Z( c+ S9 N! {/ y
  2. #include<WinSock2.h>
    1 q* v0 ?0 s1 {2 G
  3. #pragma comment(lib,"ws2_32.lib")
    7 a2 v8 q! {" l; M4 i0 {8 M4 c
  4. int main(){
    + d! O& W/ Z: a& w; G
  5.     WSADATA wsd;
    ! [1 W5 n/ l5 Y$ J+ |9 u
  6.     SOCKET sockServer;8 F, h; f' C9 Z0 n  s7 E) Q6 Y
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    8 i" `( W$ ?0 ?
  8.     SOCKET sockClient;; [8 j% F8 }: l5 ~& Z' F
  9.     SOCKADDR_IN clientaddr;7 o  L2 k" `5 r8 f) c
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    2 g6 ?( g" \( Z& n5 }- |
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
      B  ^3 Z& K1 M1 }9 d! v
  12. / P+ D6 O- j1 K) O" t
  13. 2 H6 _$ ?2 T3 H: _5 X  q
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){+ ]: _" E, k! w, p# D
  15.         printf("Socket has been created :%d", sockServer);. @$ a5 k; `& j1 j  _
  16.     }7 i: p' D. P5 u
  17.     else{
    ) ]4 R. U9 v3 y
  18.         printf("Socket create failed.");
    " g1 x2 A' H1 O5 F# X
  19.         exit(0);5 D/ ?7 s3 z% L8 a3 g/ R) H
  20.     }+ W- W) t5 v3 u2 q" |
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    $ j$ c- p1 j; n3 h7 [$ x8 e, K7 \
  22.     serveraddr.sin_family = AF_INET;  J% X  g- Y. B! W: ?, F8 u
  23.     serveraddr.sin_port = htons(6000);//绑定端口60003 {  q0 }2 f9 ^) q" u, k
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    & A$ b: ?! L6 K. v
  25.     char recvBuf[100];
    5 u: R) t+ O  w+ X% O
  26.     int len = sizeof(SOCKADDR);
    ' i/ W5 b8 O) }% N( m$ g& ]) x
  27.     listen(sockServer, 5);//5为等待连接数
    ! W1 o/ `# w' Y% _/ V* M7 p
  28.     while (1){% C. [6 I9 X9 u3 H/ U, H4 M
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);8 p8 U2 S- V1 K
  30.         //接收客户端数据0 a) y7 Z% x& ?+ O% k; O
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. U7 m! n( X9 x" [/ P9 l
  32.         printf("to me:%s\n",recvBuf);& {" F* ~* ?: }0 j/ Y5 M
  33.         memset(recvBuf, 0, 100);
    6 X8 h0 k! w0 O4 Z
  34.     }
    0 ]) W4 z0 n/ @' i
  35.     closesocket(sockClient);
    ! h# s( u" `. c  |  o9 j2 {* g
  36.     system("pause");
    ( m  l) u/ j! C8 o' A' |
  37.     return 0;
    . v% u$ J2 \8 m- S
  38. }
复制代码
客户端代码:! Q; t6 i+ n. ?' F% `3 P# U
  1. #include<winsock2.h>
    + B0 T/ u: X2 [- t* @+ \
  2. #include<stdio.h>% U2 R' x; q+ f
  3. #pragma comment(lib, "ws2_32.lib")4 s. R* O7 p* _9 l" d3 g5 i' N1 Q
  4. void main()4 V# A( U" X$ j. r$ T
  5. {' E, N7 G  I+ [. q, n& O; |
  6.     WSADATA wsaData;: f( s0 _: X$ g5 V9 b3 g- `
  7.     SOCKET sockClient;//客户端Socket* E: t6 l- G( y- P2 t" H
  8.     SOCKADDR_IN addrServer;//服务端地址! Y, [$ s9 e0 G2 M* n
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    - g& L, X+ Z) j6 U7 Q; [: [+ j: n9 M( P
  10.     char message[20] = "HelloSocket!";: k% v+ l0 ]8 F5 B' n: U
  11.     //定义要连接的服务端地址, t3 l6 b  d9 _7 J- K) K0 D
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)* L9 _; f; Q& d* ?: j
  13.     addrServer.sin_family = AF_INET;) v& J' G' t0 u. V% J! S$ ~
  14.     addrServer.sin_port = htons(6000);//连接端口6000) D! p6 s, E* W0 _; F5 p; O
  15.     //新建客户端socket
    3 S* b) S, \% I, x1 [. }
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; w2 m) d  m" l/ S# S/ E$ O
  17.     int s = 0;1 U+ b; M8 ^' |; ^5 _
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));" Y( O0 A0 E8 N9 B% `8 K
  19. , v8 O- D0 X3 [" [2 r- N/ e
  20.     while (1){
    & e  x+ M: u& A4 u0 E3 ?; b: I
  21.         //发送数据
    - l! z5 `# N5 b+ X6 z+ x" e9 x
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    8 i! y7 k6 \7 ?
  23.         printf("to server:");
    6 X. r: ?% _: l: E6 t- h  L
  24.         scanf("%s", message);
    2 P1 O9 l& G- [) e- K

  25. - F0 }. k- Z) a. o" \( ]* F4 T4 R
  26.     }
    6 |- g: D7 S5 e# i
  27.     //关闭socket
    2 p2 U3 @2 k4 v+ p$ y6 g. A
  28.     closesocket(sockClient);: S" ^  I1 s. m& d0 F
  29.     WSACleanup();
    / X. p5 d5 Q/ {
  30. }
复制代码
求懂的高手来解答一下。
( u" i2 V4 S9 H谢谢了!# ?. i8 @6 i( h3 F0 Z
3 n  \: C# \2 P$ B' P

; R2 V9 Q2 p1 ^3 H" M, N4 e, J) v" o" F: s9 Z  Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
9 B3 f$ p- Z, ^! k0 Xrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 13:03 , Processed in 0.051473 second(s), 18 queries .

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