cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。" M2 X* v) T. m. b2 p2 Y" m
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。# M+ |$ X' r4 K  ^0 {6 n
Talk is cheak , show me the code.
$ }& g# o* A! H, _& x服务端代码:
# P0 ?; @( I3 c* Q7 U
  1. #include<stdlib.h>" y# }3 p; F+ o8 m) `  P
  2. #include<WinSock2.h>
    % a9 J7 w6 l0 o: ?7 l9 _* w8 n
  3. #pragma comment(lib,"ws2_32.lib")
    / {7 B# S) w- c0 v5 d+ ^$ S1 ~
  4. int main(){
    . p, ^2 v; f1 n) P: [* k
  5.     WSADATA wsd;
    ; k: ^# C5 K9 z8 y' t1 S
  6.     SOCKET sockServer;8 {) l) a/ r, Q* q) {8 k
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号0 L/ W. m! Y8 u9 q/ R' t- w0 u
  8.     SOCKET sockClient;
    ; _3 M0 g2 A0 A. P4 z" Y' T
  9.     SOCKADDR_IN clientaddr;; F  w% \. B  X* E  T: {; V
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
      ?& _; L, g  T( L2 C
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    8 A. U: @9 d( @% D) q
  12. ! j$ B+ y' X! @" P! I; `; I
  13. 6 ]8 |; l/ ^9 p' l9 K
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    : j' ~1 I  X# z. f6 p* b
  15.         printf("Socket has been created :%d", sockServer);
    1 ?2 ]. i$ b) m- H9 A0 I. B
  16.     }
    7 y0 N3 g/ k$ M+ g( e! a
  17.     else{
      y0 L1 `: V* i% @# S8 W
  18.         printf("Socket create failed.");; ~5 f" W; M4 E5 T8 R8 P7 ?
  19.         exit(0);
    $ P* D! h2 u' A  a
  20.     }
    ! A8 D  y0 m; f  ?0 r- t7 o
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
      n1 c4 u. @+ Z% @
  22.     serveraddr.sin_family = AF_INET;
    ) `) c6 J" K2 w0 L
  23.     serveraddr.sin_port = htons(6000);//绑定端口60001 K2 J  F2 O8 Q5 E# U! V
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));0 x- o3 J4 p1 C
  25.     char recvBuf[100];
    $ H% R+ g; i/ ~3 Q/ Z& ^& Q$ G
  26.     int len = sizeof(SOCKADDR);/ |0 M! K7 `4 R' o- o% k/ w0 c8 Q, `2 E
  27.     listen(sockServer, 5);//5为等待连接数
    5 }: X: s! a0 i  h8 j7 Q& ^/ `
  28.     while (1){! [. Q3 }7 Q8 e+ F4 n1 @5 ]2 h
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);4 j7 I$ M  ~& o3 c* g+ {6 T
  30.         //接收客户端数据$ j# Z  z/ _& ^" n, E- v
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);* I0 p" n* n  k! o! q/ I
  32.         printf("to me:%s\n",recvBuf);/ x8 j2 f: r& b) P
  33.         memset(recvBuf, 0, 100);) l0 W4 D$ ~+ w  A1 b% t7 e
  34.     }
    : |* y/ J" n! c* K) B
  35.     closesocket(sockClient);5 M1 u+ Y# x5 m8 u) a
  36.     system("pause");( B, ~8 k3 t# z) J5 n9 D  _
  37.     return 0;
    9 G8 A0 G# k% A# o, p8 l2 S, X
  38. }
复制代码
客户端代码:  P- D3 o/ s8 T4 A" N+ I2 y
  1. #include<winsock2.h>1 B4 c# ]1 Y, @) J6 l& i
  2. #include<stdio.h>
    ! U) G" i& v- e. N* G: u% V
  3. #pragma comment(lib, "ws2_32.lib")7 s0 _+ W0 m6 ^
  4. void main()
    # n2 R6 K! b* K  c, D
  5. {
    $ g  B& P: ?5 b# [: l
  6.     WSADATA wsaData;% z6 P; q, J3 @3 s1 b" e1 d
  7.     SOCKET sockClient;//客户端Socket
    , ?) F! S1 G0 t: ?" I) H; G5 t" a
  8.     SOCKADDR_IN addrServer;//服务端地址
    7 U; j8 o: g5 M  @
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    9 E9 U0 e2 x( j: ~4 h# d+ s
  10.     char message[20] = "HelloSocket!";2 }/ ?* `+ g, b& T
  11.     //定义要连接的服务端地址
    7 O. Q' d4 |0 o: m) V
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)0 J: B* _0 [! S
  13.     addrServer.sin_family = AF_INET;
    ; K: T& E* ^3 V
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    5 f* x6 c' J  K5 ^$ j6 C) q6 B
  15.     //新建客户端socket5 K3 f5 |6 d( W' R
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);' ~0 N4 b( i; v# ^& z
  17.     int s = 0;8 d$ V- k* g4 b# l8 b
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    9 B  B( F; `) A$ r
  19.   |# f9 M1 B3 Q, }- Q2 b8 E
  20.     while (1){) D- E; C8 t1 S1 z) D/ t
  21.         //发送数据$ v' P" m1 p2 z9 Z+ g3 h) A9 J# J7 l! k
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    5 q$ e# H3 c4 l9 Q. z+ b) X4 h
  23.         printf("to server:");
    3 p$ \: Z- m! q7 v& K. `+ k
  24.         scanf("%s", message);/ }7 w' U4 |8 j( |

  25. ' j( V1 I1 T$ W) `  r1 c4 M0 Z+ W- r0 p
  26.     }) {6 E1 X4 H; d2 H. P  A
  27.     //关闭socket" d; t: n& C  ~( c- j! M& Q
  28.     closesocket(sockClient);
    7 H0 ^. y) ~5 ~6 _. e
  29.     WSACleanup();
    % c5 m1 I1 r* l, n/ ]- Y
  30. }
复制代码
求懂的高手来解答一下。5 A& G& ]: l: d5 O
谢谢了!
3 n5 L/ t# _5 w% P
7 j8 n6 n/ D. G4 a% e
+ i; B' S% ~+ [9 D7 a0 r5 a5 i( E* z
0 v, h* U4 M( H9 e" O! x

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为4 G* t) I0 F! ~3 h2 F! ]* s
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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