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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
# Q9 o9 j2 ?5 D+ f1 z8 A5 d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。4 w/ a! q9 v7 M( y
Talk is cheak , show me the code.
$ u! }. G% u, E" S3 h$ J服务端代码:5 a# u- r" J( q
  1. #include<stdlib.h>
    / D1 L/ C6 r4 N/ f2 z
  2. #include<WinSock2.h>
    7 X  T1 i3 a! L# x9 {" d
  3. #pragma comment(lib,"ws2_32.lib"): }. H! m) `- [
  4. int main(){( E, [2 j2 W% X
  5.     WSADATA wsd;& u! I! A2 s6 \: f
  6.     SOCKET sockServer;
    6 J/ g4 Y9 H3 M! P# Q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    5 E. p$ H- U1 @% X' ~$ ?8 K! \( s
  8.     SOCKET sockClient;' a8 s- e/ l/ R' ?) I3 u
  9.     SOCKADDR_IN clientaddr;: k5 D4 y, h: ^+ k& T3 m* _3 S" o
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口) _$ C4 _& R9 m9 E% u; Z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket; G2 A) ]6 E- s2 R1 a

  12. 2 `, P' ?" m0 r* a

  13. : ^4 |7 r2 S3 G/ u
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){( z1 c" W/ A( M; ^2 T' S/ z; z
  15.         printf("Socket has been created :%d", sockServer);2 G8 R' z' b2 K/ I; D" w
  16.     }
      \1 S% |, _% L  F/ O* b
  17.     else{
    8 M) z# I6 C; d& X! u% E
  18.         printf("Socket create failed.");
    5 q  {. Z; z3 b9 r8 t# e1 P
  19.         exit(0);
    5 n0 F5 i7 K5 _* x
  20.     }
    # \9 `1 v0 r. B5 Z0 }2 U6 F
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);" z9 l9 q+ }" y+ o2 y' {
  22.     serveraddr.sin_family = AF_INET;5 b. R+ o/ J/ f: H% g: }
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ' o) o# l1 p0 D
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    * H' @7 h/ j: p0 i( s
  25.     char recvBuf[100];7 i2 J  Z' e9 z2 ]# {, F! P
  26.     int len = sizeof(SOCKADDR);
    - l- e; x8 u6 s1 [' _6 m- m+ X  O
  27.     listen(sockServer, 5);//5为等待连接数9 ~4 H1 T" y* }! T3 }* w8 {$ H
  28.     while (1){% t, H4 e, h. j/ ~7 G) _
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);9 @- y" [, z6 c3 a# F8 h
  30.         //接收客户端数据/ v+ M; Z, i* }8 \6 O; K( A9 J
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);) \/ @2 f9 t/ H- K
  32.         printf("to me:%s\n",recvBuf);
    $ b7 k3 e8 _1 D3 p* t5 ^+ k) s
  33.         memset(recvBuf, 0, 100);2 o% ]$ X7 I3 T. q- r9 c, {. U# x
  34.     }+ j- l- z, V. F0 s' j5 o
  35.     closesocket(sockClient);
    - Y. L' U8 Y5 ~' C% L( V
  36.     system("pause");1 u9 m4 [; T1 k8 D
  37.     return 0;# F% [, R) M- |
  38. }
复制代码
客户端代码:! j" j2 Z) Z! |& E* w* ~
  1. #include<winsock2.h>
    : c/ f% _: e2 H3 M
  2. #include<stdio.h>" K0 U# c: x" S0 @5 ]
  3. #pragma comment(lib, "ws2_32.lib")
    # N( b" n! X! H
  4. void main()' w9 d: E1 b5 Z* p
  5. {
    ! ?* Z3 d  V, P$ a+ f8 h
  6.     WSADATA wsaData;
    : p0 ^; O2 Z% _1 {3 [. k0 K" m
  7.     SOCKET sockClient;//客户端Socket. [$ v. Q  Z/ d4 m
  8.     SOCKADDR_IN addrServer;//服务端地址
    * s2 h; V- n) {$ a) S' p
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    0 X  P, K* d7 O" b; {  z" q
  10.     char message[20] = "HelloSocket!";
    : ^; Q; r' Y) E5 ?3 z  t
  11.     //定义要连接的服务端地址  C7 T( c5 B2 @( P& Z" i8 H3 }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    6 m: J. a7 J. I5 ]3 m4 N
  13.     addrServer.sin_family = AF_INET;
    8 W8 R2 b4 A  ^" B8 |$ L' s1 }' y
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ! N3 J: ^0 K; ~2 V( S: L
  15.     //新建客户端socket+ T9 K! r3 _; m; ?' C6 L
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    2 {# G& x+ }3 y/ \& f4 Z+ |
  17.     int s = 0;
    5 L( @* p4 Z% j
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ P3 ~/ p% q# A4 v4 k4 Z8 k  G+ x
  19. - y8 [& ]! b( A3 i4 B3 F/ w. s& }6 P
  20.     while (1){
    6 S9 J+ u* k% d% L' f% [
  21.         //发送数据) y  l3 m" [; O! ]! g' p5 Y* }
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);* V1 O1 e1 F- ?( j
  23.         printf("to server:");$ f1 I1 }) t: f- g  P
  24.         scanf("%s", message);
    ; M: q9 p: f  f) ]" ]
  25. , h- c( ~% S1 ?: `, T
  26.     }
    ; F4 e0 H1 r/ P
  27.     //关闭socket$ k, }1 l" h' d- H
  28.     closesocket(sockClient);
    & x/ W0 E3 g+ r7 ~4 \) R+ G
  29.     WSACleanup();
    3 Q% l. n3 E/ [4 B% b/ k
  30. }
复制代码
求懂的高手来解答一下。/ [- r& I6 A7 N4 f- x. o; N0 u8 W
谢谢了!
: E* \9 A! G; I7 y! H( I

; e4 D' L9 f' y8 F- B* m4 }0 T2 b  N9 r/ |. V: O* f

* M7 i3 @* n/ V1 [+ e* t

最新评论

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

浏览过的版块

GMT+8, 2026-6-19 22:26 , Processed in 0.055452 second(s), 18 queries .

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