cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。$ M" ?. e/ ~$ ]$ A/ z2 e" s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。5 w6 w  h1 U( M  S9 V8 W+ y( D2 \. m
Talk is cheak , show me the code.5 m) P9 V" ~  j; S+ V1 c5 r
服务端代码:& z! T+ H0 B0 g' L+ ?7 G) _: F
  1. #include<stdlib.h>
    5 F, }: W' h1 y
  2. #include<WinSock2.h>1 E  i; M1 B& K0 M! Q( \# c
  3. #pragma comment(lib,"ws2_32.lib")
      K) [( F/ B: ~/ z) c' k
  4. int main(){( r5 w3 R; ?& M( W6 s  v  I* D2 e# `/ V
  5.     WSADATA wsd;7 r4 Y1 k' z1 u# Y, R
  6.     SOCKET sockServer;: v3 `) ?% G! O, f4 Q3 g
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号- w- n9 i' t* ^; Z% {; |: A
  8.     SOCKET sockClient;0 h6 C$ H$ B& \' i+ R, _
  9.     SOCKADDR_IN clientaddr;( C& c, t) Y7 w
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    1 D! i% ]+ j7 h8 N) o- N% L* c# T
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket5 f" V6 R  b5 ?3 T( R/ U! |
  12. & m) Z( k& ]( P

  13. : }. [8 P. t6 ?7 ]; R
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    5 |- s4 L4 j8 `  e( D0 `
  15.         printf("Socket has been created :%d", sockServer);
    " n1 N7 L, P0 w$ G5 S" g) Z, b- \
  16.     }
    1 K, m9 \5 a' E; ?+ |
  17.     else{
    + ~  Y! I3 G, a8 |, e8 i8 C9 i
  18.         printf("Socket create failed.");
    7 P! s2 }2 M2 l  |
  19.         exit(0);
    3 a- ?6 d6 w: {& g
  20.     }
    + ^; [2 `: Z3 h1 P& J; z3 b
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);$ Y6 M- x  @  P: j' W/ ]( j% k
  22.     serveraddr.sin_family = AF_INET;& w6 j8 |9 r, Z* K3 j  ~0 s/ T
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000, O. O+ J7 h# I; _' T  k  k
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));  Y0 Y' j& Y: K' g4 ]
  25.     char recvBuf[100];
    7 L: O/ a$ E  p: o9 p* b( n1 S
  26.     int len = sizeof(SOCKADDR);
    2 f: e# R( T" N/ H
  27.     listen(sockServer, 5);//5为等待连接数
    6 |3 D* T( Z4 k' S9 Y
  28.     while (1){+ }$ i+ C* r- B$ {! n- H
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);) S) ?' H1 d2 `) q9 x! u
  30.         //接收客户端数据
    + e# S0 t2 |; G& f( ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);5 c' e8 @0 W. ^' u4 j% \7 J
  32.         printf("to me:%s\n",recvBuf);
    : R6 U' a: Y8 h4 v) ~" N" H* Y. a
  33.         memset(recvBuf, 0, 100);
    2 x9 _" ?! ?% D" a5 y6 m5 k
  34.     }
    ! _% ]& o' }8 C) ]6 [
  35.     closesocket(sockClient);. f. U1 |+ d! _# c, B8 o; v
  36.     system("pause");' E7 a; o3 w: [
  37.     return 0;
    9 P9 J  _2 y7 m9 d  j0 q( y
  38. }
复制代码
客户端代码:
$ {$ h' K/ }* q4 q( l8 G! Z6 h) b
  1. #include<winsock2.h>
    * N5 ?! l# T, w  L1 l
  2. #include<stdio.h>, J% G1 L: a$ O1 {0 i4 U5 f$ V
  3. #pragma comment(lib, "ws2_32.lib")
    : g( q, S; {& v1 }6 z
  4. void main()' ~- m# r1 l, e9 e
  5. {
    9 t+ \' k. q9 F1 G- @. D" j
  6.     WSADATA wsaData;$ R# C/ v  Q  ]6 Q  V& o) Z. l
  7.     SOCKET sockClient;//客户端Socket' M  z" ~& ^2 R; Y6 U0 }' e& n
  8.     SOCKADDR_IN addrServer;//服务端地址( E2 U% _- k; p" Q3 q
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);; i* S+ y; n" P' Q
  10.     char message[20] = "HelloSocket!";1 C0 m6 H- o- ]# p$ i1 u9 R2 _
  11.     //定义要连接的服务端地址
    8 R  V3 ^. g& m* ~& f
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)$ f* t' o4 X8 B1 X
  13.     addrServer.sin_family = AF_INET;
    ) n' X! @9 z; I
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . q! T8 n2 ?! d
  15.     //新建客户端socket
    ( _+ z5 B/ X' S1 n
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    4 @; m# P- A( }  Z% S) l1 z- ]
  17.     int s = 0;: j4 D- Z- b+ a
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));8 \$ Z, |! b: T+ `* {- |% [; b
  19. ) Q* \9 T2 N) o0 K9 C
  20.     while (1){
    8 A9 G; Q5 F+ e* a/ X
  21.         //发送数据8 t0 `; n1 ]0 j, ^) ~) Q1 |# g
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
      b3 G! ^" }  p2 `  z; v
  23.         printf("to server:");
    4 t; \; m+ x- o' d
  24.         scanf("%s", message);
    ( v; |) j& G" l5 C  V' y. i
  25. % K; \5 R/ g! V3 `  R2 [+ w4 P( X
  26.     }! U" r& e5 H7 w. ?1 k% M
  27.     //关闭socket3 P: E! U& B4 x& l. r- F
  28.     closesocket(sockClient);
    8 N. K* v( {9 L/ h) y$ ^+ ?
  29.     WSACleanup();; h7 T& l% k( k& D6 ]1 J
  30. }
复制代码
求懂的高手来解答一下。5 l2 P9 a, d0 t. w
谢谢了!  I) F6 p; d5 L: ]; u# L5 |$ _

6 v3 t6 j3 G  t5 u4 ~- }7 e
/ x+ m  \# e8 T4 j% b: O" _4 G
, Z/ V2 {: H9 w3 A/ }
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
+ z# j  u- Q: H  q3 H$ ^recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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