cncml手绘网

标题: C语言 socket 编写简单服务端客户端通信问题 [打印本页]

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。& ?" ~% ]1 u: X; x
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。+ M% l. N( E# B3 X0 O. t
Talk is cheak , show me the code.! `2 v. R4 r: Y; J. S. M" z" x3 D
服务端代码:9 u. \$ I* j6 M9 B% D" K
  1. #include<stdlib.h>6 a+ z: {8 M$ e
  2. #include<WinSock2.h>
    . K4 T4 F" X9 x# K9 S5 n
  3. #pragma comment(lib,"ws2_32.lib")1 s4 H: x$ U" ], q/ _2 ~4 r% C
  4. int main(){
    4 H! _2 I0 g; e( H
  5.     WSADATA wsd;0 f% u# L1 n5 Z
  6.     SOCKET sockServer;
    0 z5 P# ^% t5 d2 w  C$ M" T
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 N; `  L& W& S0 N
  8.     SOCKET sockClient;
      @4 @7 S% [* h6 q, h1 q, \9 N  K
  9.     SOCKADDR_IN clientaddr;
    ; {# q. y& u* J" e
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ g2 q' N  i1 P9 r( b2 P- _0 S7 w
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket/ o$ C; e0 ^% Y, V3 e/ a! q
  12. * e; M  ?, c0 ?/ C8 g6 ^
  13. - W: b8 i* Z' d$ |
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    & P& {8 v. z* T* r, Z3 k% U
  15.         printf("Socket has been created :%d", sockServer);( k  x: ~, {3 x0 Q
  16.     }. [  u  \2 A' V& G& C& F
  17.     else{
    3 Z! M8 ^8 Q" h0 E+ l/ N
  18.         printf("Socket create failed.");
    ) w. \' G$ J3 b6 H8 R
  19.         exit(0);8 t7 p7 n7 B  f  r& J& m' t$ X
  20.     }
    , i. Y) ~- \0 r  U. y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/ F% b% S" U/ |) o1 F
  22.     serveraddr.sin_family = AF_INET;7 ]  k2 q9 l. f) c; s
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / y* }6 Q* u9 m' z
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));0 g: Y( ?( C7 k3 i
  25.     char recvBuf[100];
    ' q- `+ x' Q6 y! X! S0 c
  26.     int len = sizeof(SOCKADDR);) E  h$ `2 k+ Y( t) m1 N
  27.     listen(sockServer, 5);//5为等待连接数
    ! n/ l, B$ f4 b' ^& X0 B
  28.     while (1){/ \+ p, q% A& R. Z' I  e. E
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    6 t+ s  u: z, n. W
  30.         //接收客户端数据
    ! |6 z1 c3 G! \+ ]' {
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ' l- @. a4 t3 `9 V$ T5 x! `' ]1 o
  32.         printf("to me:%s\n",recvBuf);# C, b0 w" A9 f/ u, Y5 B) i- f
  33.         memset(recvBuf, 0, 100);
    " F% q0 R- c$ ]" b" a
  34.     }- ~; _% y. ^9 |( U, B% _7 i
  35.     closesocket(sockClient);6 A) m* w/ u* |& Z, q; A
  36.     system("pause");
      V+ s, D4 J* p. w4 n" ]
  37.     return 0;8 @; i8 J' X& [
  38. }
复制代码
客户端代码:  }7 X- b% C) E9 _
  1. #include<winsock2.h>% p2 D. a* n# J) b
  2. #include<stdio.h>
    7 m+ M7 |+ m% c& r% z3 L4 X# A- V
  3. #pragma comment(lib, "ws2_32.lib")5 b$ E4 U6 B$ G! r+ N& k
  4. void main()
    - q/ S) K: k; q$ }
  5. {
    - L0 r5 d1 [$ V% n' H
  6.     WSADATA wsaData;$ J6 ^6 p% w' F  G  n
  7.     SOCKET sockClient;//客户端Socket. i! R, I& J$ k# O5 v
  8.     SOCKADDR_IN addrServer;//服务端地址
    / B% Z; e4 R0 r0 A7 i) _1 i0 a8 O( [
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);/ ?$ K- j, V, u" P; f( v
  10.     char message[20] = "HelloSocket!";" x8 h8 G0 L- M/ O9 R4 [& h! {
  11.     //定义要连接的服务端地址
    $ ?& Q4 p" k! I) g! b+ V
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)4 x0 W# g4 T2 C
  13.     addrServer.sin_family = AF_INET;
    * m! K; ^4 A4 c0 {
  14.     addrServer.sin_port = htons(6000);//连接端口60006 i9 O/ T) |8 Q8 @
  15.     //新建客户端socket
    - f- H7 Z0 S* i" h* h* S
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    " ~5 ^) z- }5 ~
  17.     int s = 0;) D: W! p5 \& V2 ~
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));0 x/ B) W: l: B
  19. 0 ]% m4 S# P0 W
  20.     while (1){7 v  y* D1 d( O# O
  21.         //发送数据
    , \) t" |. H7 }) i& W
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);9 Y2 ^- \, s3 Z# X
  23.         printf("to server:");
    2 n$ V5 M  ^$ O: ?
  24.         scanf("%s", message);
    7 A! J9 ^; |; n8 Z6 o6 S

  25. 4 Z- l" u$ {% ?
  26.     }5 x: T" _8 @- q, h, U7 j
  27.     //关闭socket
    / ?, O: ]0 W2 K& c
  28.     closesocket(sockClient);: {/ m9 t' z/ o' }# y
  29.     WSACleanup();
    " q& `! }) m6 g) G
  30. }
复制代码
求懂的高手来解答一下。
/ b4 d( P' ]. K7 Q6 S% h谢谢了!$ a  L  _. V4 G4 o8 @

1 R! s3 U# ]: g( k6 I& A9 I) [& ]

$ i9 S5 Y" k* b0 W
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为. t5 `) o( k# _: o
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




欢迎光临 cncml手绘网 (http://cncml.com/) Powered by Discuz! X3.2