cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
& u# n8 g3 K1 Q# t: l我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
' [: |' X, F6 g: ]& K4 A% `Talk is cheak , show me the code.
- f4 g% @7 z% Y; O" e, A服务端代码:- u' r( q( T% h  B! _# w( y/ Y
  1. #include<stdlib.h>
    9 C. C* ?) _0 r( |" F  F$ H
  2. #include<WinSock2.h>
      M1 J2 Y& P# [
  3. #pragma comment(lib,"ws2_32.lib")
    ! X: w" @1 C7 g# Q
  4. int main(){; E( M+ d6 a2 j. G4 l: ]( O# G1 X
  5.     WSADATA wsd;+ n7 N6 y% D/ B1 `
  6.     SOCKET sockServer;
    % D, B/ X8 S% k4 \
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 u& d3 H# _& x7 Q1 [
  8.     SOCKET sockClient;5 y" x% G1 q/ m( V* \
  9.     SOCKADDR_IN clientaddr;- I% ^6 |( w: q& j# ^7 W
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    . j6 Q. ?6 d8 K; G8 P, p
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    4 p9 U/ v. }! w3 L% m- n% g

  12. ; F8 P* x# R7 }! w3 _5 L3 l
  13. / }5 e% k# ?: S2 u+ O/ B
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ; Y. x" q+ w9 E
  15.         printf("Socket has been created :%d", sockServer);0 K4 ?  z6 ]0 R! d, Z8 ]7 J* x' p
  16.     }' C$ f+ i5 w) J* ?0 j( k+ b' q$ \
  17.     else{
      L1 u1 x/ [7 f8 `  m, G
  18.         printf("Socket create failed.");
    % m' o+ b4 \+ Z2 o
  19.         exit(0);
    % H  Q4 d) Z, L7 X' j1 s
  20.     }* G0 C" o0 S2 P. F
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    2 N8 _. Y1 L" [! s2 @; {
  22.     serveraddr.sin_family = AF_INET;
    3 Q7 P3 e- I; r2 x, ~' W4 p
  23.     serveraddr.sin_port = htons(6000);//绑定端口60008 ]4 ]" Z- @+ u
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));4 j# i6 {# G% j! Z9 `
  25.     char recvBuf[100];
    9 f3 }+ u4 `% Q( Z6 q
  26.     int len = sizeof(SOCKADDR);& X1 B, b1 U+ t, g
  27.     listen(sockServer, 5);//5为等待连接数
    6 o  v' w8 W# D+ @
  28.     while (1){2 R" u" ^. [8 m' u) L* T
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);* i' Q0 N% I8 M! `1 I' H: n
  30.         //接收客户端数据
    " j7 B- d  M& n( O5 }* s1 D% p/ j: [
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    - Z- ~1 v( N( J  |! k/ S
  32.         printf("to me:%s\n",recvBuf);
    & m0 \! T- r; d; {0 P
  33.         memset(recvBuf, 0, 100);
    " H) _' `9 f) Z3 D! k! T
  34.     }
    ! [, u7 U; s1 I2 [/ C, n  f& y
  35.     closesocket(sockClient);  P& W- W' L5 t) ?0 K
  36.     system("pause");
    ' v) [+ j- d# C6 N& n5 w
  37.     return 0;
    + |% O) ~! a6 J. a! |
  38. }
复制代码
客户端代码:* u! j. ]( g! [: k0 d6 g- E
  1. #include<winsock2.h>
    % O; p  R+ m3 S5 ~3 L! p" c$ [, F
  2. #include<stdio.h>: r4 [! c2 {; K; u* B
  3. #pragma comment(lib, "ws2_32.lib")" U$ g# O4 v" I1 I& X: N
  4. void main()
    0 b9 J4 _6 _1 v" s4 U2 A% r
  5. {1 w5 |' ]5 c5 @& M$ Z
  6.     WSADATA wsaData;
    ( F( j4 f% H) b% L9 R* e. v3 e) j
  7.     SOCKET sockClient;//客户端Socket4 S  _: \& u1 L) t
  8.     SOCKADDR_IN addrServer;//服务端地址
    + @0 E) o* ^1 O: p+ Q* K
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    , v4 K2 u' c1 i7 P" k0 X0 R! @- M
  10.     char message[20] = "HelloSocket!";
    6 _8 Q! _* D5 m6 P
  11.     //定义要连接的服务端地址) p; |0 o- ~- x0 r6 U4 l5 v0 r
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ I; j5 b& W7 t7 a( g1 z9 |* s
  13.     addrServer.sin_family = AF_INET;
    * ~# c1 N' I7 J; B) o5 V
  14.     addrServer.sin_port = htons(6000);//连接端口60006 O& V, z+ _0 e6 S9 R+ }
  15.     //新建客户端socket
    ) b1 G- U5 G# Q# p
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    1 D! [% _- P. x( ?5 j
  17.     int s = 0;
    - U9 ^, f+ D: v+ D* j7 M! T/ F, `3 I5 s
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    5 I+ ^. G0 H: C7 _6 S

  19. % w# I; n2 M1 S/ d. ~" t
  20.     while (1){' F2 a% i1 R2 w! x
  21.         //发送数据7 O# L; K( N- q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    7 C9 w3 i+ C5 D7 f+ {( }
  23.         printf("to server:");
    - N8 ^8 j9 V; {. G' F; Q8 J
  24.         scanf("%s", message);: w. S7 Y- W& a/ B$ w. o- c8 F
  25. 7 Q4 a' b1 Z1 R& ~% f
  26.     }
    % c+ a. j1 e/ e1 ~& o0 f
  27.     //关闭socket
    - E; c5 x( j3 L9 y" a' X
  28.     closesocket(sockClient);) S" Y+ S7 I7 E3 B: K( {( t- _
  29.     WSACleanup();
    . y* g3 }+ i% I6 y3 W
  30. }
复制代码
求懂的高手来解答一下。
( e0 v/ J4 F- A谢谢了!, Z- ]! e5 X3 |! y) A4 d
/ }( a6 D8 E$ @

  C. K3 a/ {, L$ U8 h* }+ A3 h: i3 z& Z+ D. O$ z, ]+ \3 Z1 m

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# H, S6 i/ F7 ]9 p: `- O& X2 {7 g6 Srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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