cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。9 S' L& M9 M# I: e2 Q
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
4 i* I9 h- d6 c0 ^2 ?! M' J5 pTalk is cheak , show me the code.
( A9 |4 p) H) r6 s  |( u服务端代码:
+ ~% \) X( P  j/ n$ P( f0 B- k
  1. #include<stdlib.h>. G- L/ d8 q4 Z+ [2 M8 G- |+ s# m
  2. #include<WinSock2.h>
    7 t6 T# P7 {: }5 |+ I. v4 e
  3. #pragma comment(lib,"ws2_32.lib")
    8 E% F* }' l8 }( Z
  4. int main(){; U7 X5 t! C- ~
  5.     WSADATA wsd;
    ) X7 z* I; J, ]. J1 p
  6.     SOCKET sockServer;8 q- ~/ {' ^3 ^
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号! G) Q) Q5 [8 l
  8.     SOCKET sockClient;
    ' @* n3 [# e; @  `) s
  9.     SOCKADDR_IN clientaddr;( X& i" e/ o6 L5 b/ T, q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    . s% u& F; @7 q2 l. K& ]
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    0 [4 e( Q+ l" }, f" _* [2 O2 H5 @
  12. , C3 d" [9 j2 w: S

  13. ; [: U+ |; k+ m" S( E( i$ d
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    - K: {/ H$ }8 H
  15.         printf("Socket has been created :%d", sockServer);
    & Y( T2 n0 i" m) W: `( M
  16.     }
    0 R  J. q8 e- G! W, N
  17.     else{
    0 b2 V' i8 w$ h' W7 g' s  M
  18.         printf("Socket create failed.");
    5 u+ _- }6 i4 Z5 w- S2 w" F8 n
  19.         exit(0);
    : G: N' _! i2 ~. Y4 |2 l, w
  20.     }+ T, X" |, }2 |$ c0 {
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);8 B# ^- Z& x7 U+ X0 |+ h
  22.     serveraddr.sin_family = AF_INET;3 Q7 b. u8 W; U+ Z
  23.     serveraddr.sin_port = htons(6000);//绑定端口60008 z6 H; u+ {1 _. m
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    2 j! d+ b/ n, a9 y1 @
  25.     char recvBuf[100];6 N( f" x( I9 A, |7 ~
  26.     int len = sizeof(SOCKADDR);
    8 M/ E$ W. i( V/ B4 J- z. H+ K+ [! B
  27.     listen(sockServer, 5);//5为等待连接数
    5 d; l% q! p/ b, U
  28.     while (1){
      r/ s, }! q; c0 Q" X0 u3 R/ e- X
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    2 j6 b7 k5 Z" L: p; @% |3 x
  30.         //接收客户端数据
    % \8 J0 Q  M' D( O% _; V8 c6 g
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);; D/ V2 K9 l$ ~8 Y
  32.         printf("to me:%s\n",recvBuf);/ L' D6 M$ d9 i4 Y5 Y' s
  33.         memset(recvBuf, 0, 100);: ~, h  Q+ [, f! `
  34.     }
    7 T" v- i6 H& o
  35.     closesocket(sockClient);% i- N- E8 b" M, c" J' P# \
  36.     system("pause");- A( T! z  y4 y7 b  Y
  37.     return 0;
    * f$ [" r) d7 v& d% Z# T" j
  38. }
复制代码
客户端代码:4 D) z" o4 _. N+ L: V- p" ]* U
  1. #include<winsock2.h>
    ; a6 C$ x  s2 b9 z/ t4 D
  2. #include<stdio.h>% I8 B) K. E9 B! Q( \; p/ T! p
  3. #pragma comment(lib, "ws2_32.lib")
    - d% c7 f' D8 _7 J7 I
  4. void main()3 T& @2 O8 q9 k: \/ f
  5. {& ^$ c" V, W1 S! {5 y
  6.     WSADATA wsaData;
    " \; D, ]5 k+ s$ a; N
  7.     SOCKET sockClient;//客户端Socket
    6 \+ f# S3 g7 b0 B
  8.     SOCKADDR_IN addrServer;//服务端地址+ Q+ g% e7 t( s. j, ~+ v% `% _' z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    8 U4 b0 v; N3 u+ }" L7 w
  10.     char message[20] = "HelloSocket!";
      M+ G  X: \' z! `7 B# x4 o
  11.     //定义要连接的服务端地址6 d9 ?% _' X; O4 z& `( T
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)1 L4 O8 M/ N3 \
  13.     addrServer.sin_family = AF_INET;8 ~: l; Y; q( }; g" F0 F5 r) M% l
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    8 J0 i! z: n! A$ E( q0 |: `
  15.     //新建客户端socket
    2 h6 L( D# W' K0 N: V. L
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);: {! l: S* b- k' ~0 ?- Z' z
  17.     int s = 0;: x+ [9 @2 {! H( @8 D
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: u& `+ T6 v0 [+ f5 a2 ?  n
  19. 6 c" J1 i, G/ a- }) D" e. l; e5 m
  20.     while (1){
    6 s4 G; f, ~9 m8 i1 {  c0 T% }
  21.         //发送数据0 Z! ~) Z+ O; Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);* C. ^. b$ a& q0 X( U9 g
  23.         printf("to server:");
    ) R$ {# B0 \" d
  24.         scanf("%s", message);
    % a# `7 \, @/ K) A7 X
  25. 7 r9 b0 ^1 v8 K! t
  26.     }$ g4 t3 ~/ w* e
  27.     //关闭socket" S5 s6 ~0 T, K- y
  28.     closesocket(sockClient);
    7 B7 ?/ t* g4 Z
  29.     WSACleanup();% S/ q/ A4 C4 N0 N: E& T* P
  30. }
复制代码
求懂的高手来解答一下。
/ x1 u9 Y6 z- P9 i! J谢谢了!
/ O5 j3 t2 \5 b! J5 Q- }% l% w
5 F4 t0 M( \- z8 \3 M+ L

% h4 p/ `/ S; [& E$ ~2 k/ K
! }+ G( |: s' `/ H/ m& {
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为# Y4 [$ }& i" e
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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