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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
& n  ?$ G& q- F# n$ r我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
. Z  w  l$ a% |5 y, o7 b8 }! @/ dTalk is cheak , show me the code.
3 h' @: C4 c2 ?% G  a服务端代码:
0 o5 ^4 x' a+ V3 b
  1. #include<stdlib.h>0 e& V+ `& P7 b7 q" q$ v
  2. #include<WinSock2.h>& [( h/ E) V8 f7 O5 g
  3. #pragma comment(lib,"ws2_32.lib")
    6 W/ @* G. G; x8 l3 |
  4. int main(){) q' x+ {, ]6 G: ?5 E
  5.     WSADATA wsd;+ ]! u1 d& N8 \4 j. y; V
  6.     SOCKET sockServer;- D2 c+ F  b$ i5 |
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ( e% u9 Q/ E3 I! O' A! b. U
  8.     SOCKET sockClient;7 L, j9 [8 U; l, p
  9.     SOCKADDR_IN clientaddr;
    ; q! I+ g3 \1 P! g
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口9 J% J3 z$ \" F7 f
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    , ^1 K' ?9 q6 d5 p

  12. ' Y+ k6 m) Z% u. t
  13. ( K2 h1 V7 V  j- A
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){9 d# J1 I% D  \4 j+ j; O, a
  15.         printf("Socket has been created :%d", sockServer);
    + Q, m# F, k/ c! w. y7 k
  16.     }/ z: o7 C: C% E) D1 v' p
  17.     else{
    5 y- \/ R, u7 w
  18.         printf("Socket create failed.");
    + _( r+ y0 a, F( ^* ^2 g
  19.         exit(0);2 h/ B7 T6 F7 |8 _
  20.     }
    4 ?/ c+ p) Z3 H/ ?+ `
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);( E& X% v1 e" {
  22.     serveraddr.sin_family = AF_INET;
    / h% V3 m7 I; |! N
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000# i/ Q3 w& p) ]1 F) h7 W
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    & r+ ?- i( G: c) y& ~7 F
  25.     char recvBuf[100];3 `/ ]8 O2 v; M* u
  26.     int len = sizeof(SOCKADDR);
    2 H* R. X/ r+ V/ \" l
  27.     listen(sockServer, 5);//5为等待连接数* R( u7 O2 c# c
  28.     while (1){! _0 h6 `. J  c
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);" u9 y1 J& Q4 A& S9 ?. t# r
  30.         //接收客户端数据2 R% }, W9 p( B
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);0 ^& Z/ V9 a! a( s. w% i
  32.         printf("to me:%s\n",recvBuf);' y2 F/ \) H0 x0 i$ ]
  33.         memset(recvBuf, 0, 100);
    $ @& S$ N2 M& L2 S8 _# U
  34.     }
    1 P7 q  _/ @& I1 f
  35.     closesocket(sockClient);0 d4 N% i9 K3 _0 g+ Y
  36.     system("pause");
    ) q, ?5 l( Q3 _" c( z
  37.     return 0;
    9 z4 B, G" h. h4 C8 L; K- H" k
  38. }
复制代码
客户端代码:& e7 o2 T2 y4 C3 o1 o
  1. #include<winsock2.h>" |- N) v5 Q: w- R* g# k
  2. #include<stdio.h>) U7 Q' p/ C, b/ R) ?
  3. #pragma comment(lib, "ws2_32.lib")
    6 s% S* V; E0 [2 H' ~5 b5 ?
  4. void main(): H6 t+ g. N5 e5 n
  5. {8 p. E* O7 s7 D
  6.     WSADATA wsaData;
    ) D8 b& ], w& b" F& m0 t, T
  7.     SOCKET sockClient;//客户端Socket
    ; @. I! E- f  ~; ^- D7 ~3 J
  8.     SOCKADDR_IN addrServer;//服务端地址" v. Q3 F. h. I# J2 ]. `
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    + G+ [; N: T) _! {3 R
  10.     char message[20] = "HelloSocket!";
    ; ]1 ?4 L6 }% G, G
  11.     //定义要连接的服务端地址
    6 L& ~1 c3 L+ g
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ b4 |& }7 J" h. f, F" W
  13.     addrServer.sin_family = AF_INET;. S# C% J: P0 d. `+ i! ^
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    * M' L( x9 f6 L) Q0 T- G* b
  15.     //新建客户端socket
    . `9 }& D) Z! i  Q0 G+ `/ a
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    2 r# c; C4 r$ b/ O0 S# c* M$ ~
  17.     int s = 0;1 s. ^( x0 a9 p# p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));" F& f: A& J  n, P

  19. ( G$ W' F; P6 `& ^
  20.     while (1){
    / g: h; _8 T' x
  21.         //发送数据/ S2 p8 l: `! H9 x8 l
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);/ u3 p$ |8 n. G
  23.         printf("to server:");, B& [% @0 w- W' q+ Y0 Q2 V
  24.         scanf("%s", message);
    + Z% |; _/ T8 r+ S

  25. ! q8 t1 S; |: `0 @1 G
  26.     }
    & z1 i& y7 d) H7 e
  27.     //关闭socket) L4 @3 M4 e/ o" i# L  N
  28.     closesocket(sockClient);  H# Z: U7 ^. Q' d/ F( J. W
  29.     WSACleanup();
    5 b& N% J5 X) v2 X2 Y
  30. }
复制代码
求懂的高手来解答一下。. a5 O" Q3 X9 ^
谢谢了!
; O) N0 _8 [- {. M9 G- g2 I

0 A* E* E2 L" Q# b, p: W& T
3 S4 L" p  n7 k+ T+ V. k. v5 b. f5 o1 h: G# y/ |( k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
8 {5 Y$ u: _; j0 urecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-7-20 03:34 , Processed in 0.064401 second(s), 21 queries .

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