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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15964|回复: 2
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。% C+ W2 R+ [, p4 G+ \3 `$ v& s( `
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) v0 {* G, s+ |5 YTalk is cheak , show me the code., f) n8 ?2 \- _' F. G
服务端代码:
& p' T# A& L! M- b
  1. #include<stdlib.h>% }0 x8 I4 W, D) h' C
  2. #include<WinSock2.h>: c0 s+ M8 {9 b8 Z
  3. #pragma comment(lib,"ws2_32.lib")0 s$ \& F% O2 a; R
  4. int main(){
    7 y$ S& a% E0 }
  5.     WSADATA wsd;
    7 |; A7 e% l. K8 X
  6.     SOCKET sockServer;
    # t9 _& z# C. O: G. y% o* h
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 o1 y6 V" D4 h& t( M
  8.     SOCKET sockClient;  s, w4 g9 N  H/ }/ i  H
  9.     SOCKADDR_IN clientaddr;
    ) h% q! o$ o$ c" l9 Q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    1 }9 A# i, B1 U8 T/ @
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: i* L) g  ~  X: z
  12. 8 _( }7 Z3 b$ p* {
  13. , S% ^9 ~" e* y( S1 m$ K" c% u+ i! |
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){5 m0 ^( X: z* |
  15.         printf("Socket has been created :%d", sockServer);
    # _' L8 i) K. l' [/ [  m+ i4 m
  16.     }
    * _/ `, E2 g+ ^+ b
  17.     else{: e5 a1 ], w9 r% V9 r5 H* r) _
  18.         printf("Socket create failed.");; ^4 g/ u5 ^) h' W6 p* g2 l
  19.         exit(0);  ?4 n: y" l' b/ g5 C# t2 f7 }
  20.     }, c" i1 [/ o& e* e* K
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);& }5 S2 g& U( p7 Q1 B2 T6 A
  22.     serveraddr.sin_family = AF_INET;
    6 J1 J! d6 h0 |7 k- O+ X+ J, ]
  23.     serveraddr.sin_port = htons(6000);//绑定端口60002 u% N3 q* g/ c, A  A; o! D' a
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));( d4 F3 K" _7 y. d" V  Z/ M
  25.     char recvBuf[100];
    3 x. \; k" z: D5 C  }
  26.     int len = sizeof(SOCKADDR);- q( W2 s- Q5 z) A7 u& [; T0 x
  27.     listen(sockServer, 5);//5为等待连接数
    ; Y6 Y; C- L8 f1 ]2 l
  28.     while (1){# u/ k0 S8 _0 w. k# H: m6 C6 \
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " W+ k; N; \2 ?
  30.         //接收客户端数据
    ) B$ }* D8 [6 h3 M3 v+ R/ }) R+ u
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ' c: ~+ d- u+ t) g$ ]( U0 a9 A/ H
  32.         printf("to me:%s\n",recvBuf);. g: S1 `' p  h2 i4 u
  33.         memset(recvBuf, 0, 100);5 x/ Y* Q) D; X( c! C: H  M
  34.     }
    2 K6 S* K+ _4 o/ F
  35.     closesocket(sockClient);
    % {$ R( d. j8 g" C
  36.     system("pause");& C3 \- L9 c2 @( l; c
  37.     return 0;
    & \. w5 ?, z: s7 M% w8 R1 d$ h0 v0 m
  38. }
复制代码
客户端代码:
; O, e- H' \& t  t0 I
  1. #include<winsock2.h>8 [/ ^3 K! w0 _0 U: D
  2. #include<stdio.h>9 y& t; ]( k# u  [+ m; r
  3. #pragma comment(lib, "ws2_32.lib")
    7 b6 N6 X/ d4 |, Y/ ]6 `7 e8 q
  4. void main(); P& M& I3 o1 U/ z1 K1 c- H% r1 x* O
  5. {
    : v" i# M9 m: T* N, q  \) K
  6.     WSADATA wsaData;) X1 a' N& g$ ]' r4 \# o  t
  7.     SOCKET sockClient;//客户端Socket+ K* c! H9 D/ |8 w2 j
  8.     SOCKADDR_IN addrServer;//服务端地址
    * G! W" Y8 A6 A7 I
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
      s" ^- @& L8 T4 g" |
  10.     char message[20] = "HelloSocket!";! l$ r0 E' N6 N+ `4 l! e
  11.     //定义要连接的服务端地址# s) g! v0 H1 F# G4 ~9 b  l
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)) F& J! l8 S) b$ D1 e% J7 {
  13.     addrServer.sin_family = AF_INET;
    ; V! r; r5 \9 K; |! f
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % n6 U6 U; [8 \" U
  15.     //新建客户端socket9 x0 p3 }6 L1 N* f0 h1 e! A
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);! [- T$ @% x5 m: A7 r" }3 Q' B7 T7 B
  17.     int s = 0;, z/ ], A- r6 V. M  ~% a
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    0 T& P  X) E7 P) }; z3 m  z* c) J
  19. 6 E; D+ {- v, k+ l2 E1 j5 O% g) g
  20.     while (1){
    6 g, p, _( T2 {- I2 j
  21.         //发送数据
    7 r+ L& y2 O$ i6 v* n
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    5 u& J$ a5 Z3 f  l3 D& T
  23.         printf("to server:");/ g% M/ B. h5 i7 g& K! L. W
  24.         scanf("%s", message);3 [# N( _* T) h; M! M

  25. 4 V% x5 v4 X- O
  26.     }+ V3 _5 ~& i3 d" T+ D
  27.     //关闭socket
    ' z' z+ o1 H6 J0 W
  28.     closesocket(sockClient);! u# Y& t- [6 \# e$ W4 a2 p
  29.     WSACleanup();# j' z0 i# h* A- z% M
  30. }
复制代码
求懂的高手来解答一下。
5 G9 h! O: O/ V2 B7 _5 X/ |谢谢了!
; W8 J& y: b% F+ z

+ P' B5 h# w+ S: w6 o
9 |0 y: g- z. O4 i0 _5 u' o: }
1 S& {9 b. I) h  D! F1 A# g6 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
9 T' l- ~- J8 m$ hrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-17 18:06 , Processed in 0.070417 second(s), 18 queries .

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