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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 12041| 评论数: 2|帖子模式

大家好,感谢你的回复。- u" u* G) k1 f  R8 j9 ~
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 G9 S# R' C  U6 J  RTalk is cheak , show me the code.
, V8 \( v7 k0 U; _% |! j- M服务端代码:- e9 H  i2 G: f- [; ^# m6 G
  1. #include<stdlib.h>
      O9 f& T3 f8 Q3 {! C
  2. #include<WinSock2.h># _+ I# O$ I& d, u6 K* N2 S; X! H
  3. #pragma comment(lib,"ws2_32.lib")
    " _0 t, M0 I8 o; Z" |
  4. int main(){
    , s2 D& Z4 M; W' T1 _3 p" o
  5.     WSADATA wsd;& X0 P1 d* T1 L5 z' o1 [
  6.     SOCKET sockServer;
    5 D7 o2 \& ^$ E3 m) \
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号7 d# ?; U+ H+ D# T, \# }) L# u8 M, z
  8.     SOCKET sockClient;- q: k/ g+ F6 y/ r. M. d
  9.     SOCKADDR_IN clientaddr;5 n  F( Q* @8 A; D, p% u+ Y9 T7 f
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" P) q& U+ R* _0 ?+ W$ ?$ S
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket, I( l8 L0 t1 a  _, T+ E

  12. " q& Z0 H0 I- ~; x
  13. 8 I5 L3 x% I* d7 |' o+ B
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){! L: S5 S; g4 x9 V* t3 w8 S; u
  15.         printf("Socket has been created :%d", sockServer);$ ^: e! }, n* f1 p; ~. m) |3 o
  16.     }
    # d, Y. g9 ]: _/ @; x
  17.     else{
    7 N9 @) Z8 l9 r; K$ e& X5 g- s
  18.         printf("Socket create failed.");. q; Q) q! s  q, c- V8 S! U
  19.         exit(0);4 S' s4 n7 h4 R+ C5 ]$ S/ M* r
  20.     }
    / i7 G! i3 y& A; T  D
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);' a& ^, a$ N% b
  22.     serveraddr.sin_family = AF_INET;2 P& T( H0 }1 N7 \, V. W
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / M. b& v+ K' Q" P" t! ]$ B
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));+ U! Y; l2 r& ?8 ?1 H
  25.     char recvBuf[100];
    ) N( T, M. ?- m
  26.     int len = sizeof(SOCKADDR);
    5 H; v" T- s; K$ ~
  27.     listen(sockServer, 5);//5为等待连接数
    1 D3 r$ |4 H" `6 ~4 Z1 t% J
  28.     while (1){
    $ h; z6 D0 l- M, G/ n4 i( x$ n
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);5 x( A4 d. J) b: j* X
  30.         //接收客户端数据
    9 Q6 u. f/ Y: H5 i! H6 S% A5 Y9 T
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);1 U5 x9 I7 q5 x* v4 V) `
  32.         printf("to me:%s\n",recvBuf);
    & A+ }: r5 `# C% a6 x
  33.         memset(recvBuf, 0, 100);: z: S1 d3 i$ w' T4 |* \
  34.     }1 P. }6 [  b( w( ~: J, X6 c
  35.     closesocket(sockClient);1 u; h* R$ b) k$ a
  36.     system("pause");
    ! r  x$ y" R" |0 r) H/ v/ g
  37.     return 0;; G& q2 h: a2 V2 X1 k; i- d& X5 i
  38. }
复制代码
客户端代码:, b9 B0 @1 H' O% b. [. d
  1. #include<winsock2.h>
    : k- o0 e5 ]4 P4 Q% p6 t
  2. #include<stdio.h>
      k9 E1 j7 T2 w8 `( }9 C8 I
  3. #pragma comment(lib, "ws2_32.lib")
    ( J' j# x) D, s9 t. t" K
  4. void main()6 M; v; P( a5 N+ O: ~! u
  5. {+ L( J4 h2 j1 g% Y
  6.     WSADATA wsaData;
    1 f* {& u0 Z7 [- ^) K+ I7 S
  7.     SOCKET sockClient;//客户端Socket
    # S5 D. e) C4 t1 I0 o6 N( e
  8.     SOCKADDR_IN addrServer;//服务端地址
    3 }) \- d+ E( d/ k$ ^; N: C
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);9 D  m' }% `+ a0 @" X7 U. `$ G6 ~
  10.     char message[20] = "HelloSocket!";
    1 b$ A8 _2 U, S' e0 j% y
  11.     //定义要连接的服务端地址
    0 T. y/ }7 o  W* S" v5 c
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    - ^( c) ~- G0 _2 p
  13.     addrServer.sin_family = AF_INET;- D/ a2 g/ n2 K& H, t
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    - X) r! M  K1 \4 \! a+ t' w
  15.     //新建客户端socket
    " ]# f; U: D4 T0 S- I5 a( j" e
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    / g+ D5 x4 Q: E
  17.     int s = 0;% G7 P' h* d0 A1 R
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, |4 \& J- i$ z( N

  19. 7 K" ]- }/ |- X' f( Q+ i# n
  20.     while (1){
    % q1 g- X# D" U' A2 D6 q
  21.         //发送数据
    ) y- h4 e6 z9 |# R) ~
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    # I2 `) P8 d: h( J
  23.         printf("to server:");7 j0 k3 @* B$ h
  24.         scanf("%s", message);
    ( ~1 o* [8 G8 q8 c& u
  25. # T( K; I- W- O6 e' u9 _" X
  26.     }9 _6 _, B4 K3 ?  `
  27.     //关闭socket' W( ]& X1 i" R6 d, C
  28.     closesocket(sockClient);8 B6 ~) _5 x) V  B9 Y
  29.     WSACleanup();
    & K! Q. k' d# Q% D
  30. }
复制代码
求懂的高手来解答一下。
3 \# k. W% @- v谢谢了!
; Y0 C) ]5 y- u8 q2 a) Q$ L

7 n* h& r2 h; ^8 s; p7 A0 W) P1 E% J3 q; C) K) t+ U

( z& q2 i, r# y% F! C% P

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
  u1 \  p* a7 g% Frecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2024-10-25 02:12 , Processed in 0.092332 second(s), 18 queries .

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