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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
* G9 V1 W0 I1 W: a5 E, X1 E& u我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。) Q7 R' Z/ r/ \$ Z
Talk is cheak , show me the code.9 [8 X. N4 }: R% O& F! k
服务端代码:
& K$ M' }0 B/ k' q) J6 k
  1. #include<stdlib.h>( q* r; l5 D9 o: F
  2. #include<WinSock2.h>* ~: k  D5 U% p9 f
  3. #pragma comment(lib,"ws2_32.lib")
    0 i2 s; c- v& Q: k) [
  4. int main(){
    5 l2 J& J( Z- ?' s+ Z+ e& Q
  5.     WSADATA wsd;
    3 f; o$ P. Q7 [' w4 u, t. C
  6.     SOCKET sockServer;3 `' K# `6 P! I2 R. C  s
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号: w! E6 k0 }' C( M# u
  8.     SOCKET sockClient;- d6 q" i6 I  r8 K1 y
  9.     SOCKADDR_IN clientaddr;! X4 |, R4 {2 ^: a6 h
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ( b2 @& c4 p! Y" I" C1 L+ `% ^) J; l
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket0 n/ j8 j. G5 k- G# }
  12. , I& c) d  u7 T7 @: t, F

  13. ; u4 v) G8 Q5 r
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    " t. f; f9 H/ e
  15.         printf("Socket has been created :%d", sockServer);
    + q9 `& G- n3 {& g" F6 f' R+ u. }
  16.     }
    + I" b( g7 k/ x5 n& X: S( H
  17.     else{
    6 G+ Y! B+ M6 Y7 z
  18.         printf("Socket create failed.");
    * D) f2 a7 C4 {4 U4 ]" C
  19.         exit(0);
    $ @+ q5 c) }2 X# x
  20.     }
    - Z6 f: @* \/ l1 N. k) R
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    . K9 E/ M2 e: k- T1 ]" o# W& |$ d
  22.     serveraddr.sin_family = AF_INET;* ], b9 m4 `. D7 G
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000' p2 |  T0 F) d
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ; z4 y6 m: f( ]1 N
  25.     char recvBuf[100];
    , ^8 u7 @8 f( S1 p
  26.     int len = sizeof(SOCKADDR);
    1 n& s, _5 i: t% [5 T/ P  W
  27.     listen(sockServer, 5);//5为等待连接数& V. V! [7 I/ d  J* ]
  28.     while (1){, X" c# U# @5 r8 ]8 O- g6 J2 n$ o
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);$ K6 t. R8 [7 \- v& o/ \' i, T9 d
  30.         //接收客户端数据6 x. F) @2 L% ^8 [& Y% H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    . Y! F( h2 P. Q! r$ o& A
  32.         printf("to me:%s\n",recvBuf);$ v" B# A3 ?3 V. F7 q
  33.         memset(recvBuf, 0, 100);/ b. h* s/ l+ O$ Y5 d
  34.     }0 h' R$ W; E+ S" f% g+ D9 V
  35.     closesocket(sockClient);
    & E9 O) W& h, P5 C1 ?: a
  36.     system("pause");3 M. e3 j. e9 G$ h9 q$ b# A% e
  37.     return 0;
    7 Q4 k  O  o' {  w
  38. }
复制代码
客户端代码:
* |/ J% Z* r7 d$ Z* U
  1. #include<winsock2.h>* Y) n/ P- f1 \  N) Q6 b7 V
  2. #include<stdio.h>  t9 {5 h$ d/ J* L
  3. #pragma comment(lib, "ws2_32.lib")4 h* m: F6 n0 n. _# ]
  4. void main()
      z% c/ q. A  h, r
  5. {) h5 _5 j- w/ f! X
  6.     WSADATA wsaData;
    / x2 ?$ `* k% k6 N$ W- L. ^. o4 O
  7.     SOCKET sockClient;//客户端Socket' |9 K: `% W! k$ A
  8.     SOCKADDR_IN addrServer;//服务端地址2 p4 u1 ?) Q8 J/ a" Z! z* v
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);" T& F- r: n' O' h; E. }
  10.     char message[20] = "HelloSocket!";7 K. A8 B  `; p, ^
  11.     //定义要连接的服务端地址) l  o! n9 J* M- \" h! V6 E# }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    $ R: k" u% `  h' H) M3 y1 G
  13.     addrServer.sin_family = AF_INET;+ K2 [* M5 q" V  Z1 {: o9 p
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ' l3 K9 L: j: {7 T0 q1 J6 K
  15.     //新建客户端socket
    / ]9 s% Y$ N% q: e
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 \9 |' V( \! i( x7 p* R
  17.     int s = 0;
    / |7 [  z) ^! W2 A! m' m
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));( W& p, d; H" b( e

  19. 9 h' z% G: O% X2 Z% V! E- O% Y
  20.     while (1){
    7 J. B6 q3 f8 T! P" |6 ?# R! q
  21.         //发送数据/ J0 F* {1 E% [" }9 p6 ]- i1 A& q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);$ J  d2 K, D9 X1 l
  23.         printf("to server:");
    $ D4 h5 p) l7 O$ P% ]' M8 X
  24.         scanf("%s", message);
    , Z2 @& |, h- \3 p
  25. 8 z8 A: n( ^1 C- C/ h* Y
  26.     }
    2 G0 ?$ N5 H# b
  27.     //关闭socket
    1 `/ y9 R1 n& A( }' a# m& |
  28.     closesocket(sockClient);
    : `5 y  q, }7 l, S( l
  29.     WSACleanup();
    / E0 b# I2 G& o0 u" R$ S" m! H+ H4 ?
  30. }
复制代码
求懂的高手来解答一下。: c$ S0 T% u5 l' x% I
谢谢了!" G8 k$ |2 b2 T2 }7 T1 H9 a
  p2 \0 L5 h. l6 m" |

# s( {3 v, c8 M0 H2 N% s. {, S2 `& |8 ?0 l, ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
8 e, c3 y0 s  Trecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-17 16:12 , Processed in 0.055633 second(s), 19 queries .

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