您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10059|回复: 2

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
发表于 2020-5-9 02:32:26 | 显示全部楼层 |阅读模式
大家好,感谢你的回复。
. h  K, `3 w% h; `我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ [1 z4 _0 J" G/ ]
Talk is cheak , show me the code.
3 W7 C# W  k) C6 m: }4 H. g服务端代码:! J0 i* W) {2 K+ D
  1. #include<stdlib.h>4 k. A& R* i  H# v
  2. #include<WinSock2.h>+ |+ h/ o% m. F0 b3 f
  3. #pragma comment(lib,"ws2_32.lib")) f7 G6 T% M" Q( a/ G
  4. int main(){
    , M+ I% a2 D/ r, ~# _
  5.     WSADATA wsd;% J# q) K: u( I' N
  6.     SOCKET sockServer;
    . c+ l2 `/ Z2 a% A) e
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号& Z& R: k# H1 ], K( J0 C. X
  8.     SOCKET sockClient;: d; z( C% \. r/ }4 J. ?- _
  9.     SOCKADDR_IN clientaddr;# }& {9 Y0 p. i8 [1 j  T
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口; p; b- a8 F" l9 r! ?' L# k0 C: `
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 s: Y- t; t4 f
  12. 2 d6 t; j, ^# l7 X- P6 B

  13. - _' j. `9 U8 Y0 Z3 _
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    4 C/ b1 U2 o# f& D" J4 ^+ s
  15.         printf("Socket has been created :%d", sockServer);$ i* Q& n9 ?5 N3 @+ H) U# U2 y
  16.     }1 i# _6 L, J( m0 K$ t$ `# C! R$ V
  17.     else{
    3 O$ K: ?* w7 n9 }% [
  18.         printf("Socket create failed.");
    ' U& c" E9 D5 K9 H* @$ y: G! ?# y
  19.         exit(0);: ]) B  x" y- v1 P: ~
  20.     }
    : @( \9 C$ Z8 U/ H8 ]
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ) K3 f* _$ \* x6 J: m5 ~
  22.     serveraddr.sin_family = AF_INET;) v5 a: C. ^2 a7 d
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * g6 C7 @; [- n& B* c5 m
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" [/ A5 M, E& M4 S: D
  25.     char recvBuf[100];1 Z& S% Z3 G; [
  26.     int len = sizeof(SOCKADDR);4 M7 W' F& u8 Q: I- d- [7 U) ~
  27.     listen(sockServer, 5);//5为等待连接数4 d% ^& h' U5 Q
  28.     while (1){
    0 `; |: x1 L2 R/ U" X
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    # }8 i% B! i7 G6 ]
  30.         //接收客户端数据
    ! i  z6 m2 w6 S5 w( I
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- J# ?+ @* }! F
  32.         printf("to me:%s\n",recvBuf);& c( n6 ?7 r7 K
  33.         memset(recvBuf, 0, 100);
    - U& }- i1 Q5 S4 N& Q' A5 X$ [
  34.     }
    7 T5 J: j! S7 c
  35.     closesocket(sockClient);
    9 j. U- V( [2 m6 G* P
  36.     system("pause");0 W9 ]; Z. A. P1 P* n
  37.     return 0;
    1 X+ n1 r0 T, x4 G* p5 ^" b
  38. }
复制代码
客户端代码:" y* ?# e% [9 c8 O  X5 h) p# r
  1. #include<winsock2.h>
    # d: y% s1 ~+ H* x4 V5 x$ h
  2. #include<stdio.h>
    7 k6 o9 B# V% }
  3. #pragma comment(lib, "ws2_32.lib")
    / O  W* c7 H! l/ S$ {; f1 e+ a
  4. void main()
    ( o# K$ I% I5 n6 q
  5. {4 E. y2 C* n% d' |: @' s
  6.     WSADATA wsaData;; Q) X+ P' ~: x/ p9 k
  7.     SOCKET sockClient;//客户端Socket$ j6 H) e( [9 O8 t/ b) L, ?! \; u
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ s( X* M3 s$ ~9 d2 U- w
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);2 j5 j8 F, z* J& r9 ]& n) O' q% h( |! Q8 e
  10.     char message[20] = "HelloSocket!";
    ( K' T/ A: v2 I; ^8 c0 f2 w6 G  P
  11.     //定义要连接的服务端地址9 ~6 Y3 [, |1 \% n+ E: J
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    / N6 J# G4 D9 p* J8 H( x4 _& q
  13.     addrServer.sin_family = AF_INET;
    0 w( i, B5 b( g0 }* T. x4 V
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    0 U7 E/ P; W% m" }" F( T
  15.     //新建客户端socket4 Q7 f% T; B/ D( e# q
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);+ s1 S0 I& X1 Q* {4 |0 }6 k
  17.     int s = 0;# `3 S. l, z$ v9 `1 W  D3 U
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ t  p4 `/ i. D/ I) p8 u' q
  19. + v% P) f! _6 }# A3 S& h, E0 R
  20.     while (1){
    7 @0 F. s8 J6 c; _& X8 n
  21.         //发送数据
    1 T0 e6 ]" j, x3 n7 p; e5 `" n
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
      U8 I6 i+ W, e+ t, K% L- z/ o& u: N  {" L
  23.         printf("to server:");
    * H* j6 W1 J) K# ~
  24.         scanf("%s", message);
    3 V- k" g( c& h+ J7 H. f( S

  25. 6 g$ R7 I# r+ v
  26.     }
    6 O% Q# N$ u0 t  N: M) V) s
  27.     //关闭socket
    ! U+ C- }' K2 D. v; h& U
  28.     closesocket(sockClient);6 w( c% z9 E) G2 M
  29.     WSACleanup();
    + F$ H+ V! f/ x4 K" P
  30. }
复制代码
求懂的高手来解答一下。
# ?3 H+ X7 d8 [谢谢了!1 |6 m5 n0 m2 x* C

/ ~/ C1 |* u+ A( k, @2 a: R' J
2 c# q" _, ]" S% F2 b
! V. c, u- u; n. m
 楼主| 发表于 2020-5-9 02:33:06 | 显示全部楼层
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 02:33:20 | 显示全部楼层
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
  j. H& h0 }1 b. S0 l3 mrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-18 18:53 , Processed in 0.133366 second(s), 19 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!