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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
$ C  Q9 D+ R. C" J3 d! T- C我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。  R. F8 c& y( C- T7 ?
Talk is cheak , show me the code., o4 J. B, g( Q) F/ W
服务端代码:; @3 ]  s- X4 J  Q& ^* l( ~
  1. #include<stdlib.h>8 v! m4 t( g- I
  2. #include<WinSock2.h>
    . E! A2 v" f- I2 m1 b
  3. #pragma comment(lib,"ws2_32.lib")
    1 U, W  z) L9 ?, _* L
  4. int main(){$ ]) @. p+ A2 ]6 H% H5 v
  5.     WSADATA wsd;% @1 _6 ]/ H+ p0 q2 N: O
  6.     SOCKET sockServer;) r( l# D2 V' h% z0 O. \9 E
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ! x5 N4 K' x0 C2 n5 t( {9 q* f+ A* V
  8.     SOCKET sockClient;6 j# @5 h+ Y/ B+ ~, A' Y# U1 [7 U
  9.     SOCKADDR_IN clientaddr;! j/ g3 b  r6 G8 @' P8 X  h+ E- n# l
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    : ]( b9 H, h# J3 I; J: x6 v! w: g
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket" m9 [* X0 a4 p( `" ]
  12. 0 k- j! ~( W2 b# J* G/ E: T

  13. + x0 z1 A% k6 T
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ) O9 g, I9 g, d5 q) S
  15.         printf("Socket has been created :%d", sockServer);- Z& C0 Q9 r' t' j, e6 ~" \
  16.     }
    3 H. K7 ~8 z" T
  17.     else{
    $ r2 ?6 B2 ?) i; T% G1 B9 Z
  18.         printf("Socket create failed.");
    + f/ H# c, f2 t0 M+ [5 u3 n$ {& E
  19.         exit(0);' i- I* q: L9 {$ s) ^1 D
  20.     }" _+ R' z# q& Y  s( K5 o
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);6 l6 Y. g% }) g; x( O% V
  22.     serveraddr.sin_family = AF_INET;
    5 y: A& e0 ?1 H8 \4 b, q* p
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    3 [6 ~- w6 P; S  m' n
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    2 C5 C; |3 @, z
  25.     char recvBuf[100];
    " E6 V! v/ {0 T% t& I" x) T
  26.     int len = sizeof(SOCKADDR);4 g9 a1 U" O0 ]. P8 V8 \5 ]- O
  27.     listen(sockServer, 5);//5为等待连接数8 a5 w; A0 }0 B3 t# l; a0 C- t
  28.     while (1){- P) z2 Z8 u7 q% h& e$ N
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    2 M8 |2 Y# o. S  u; O( E
  30.         //接收客户端数据7 c( s# J& b. p: Q) a4 P
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    9 U# A# @" e; s2 d  T
  32.         printf("to me:%s\n",recvBuf);
    " s7 F' U% ]" `! Q9 b8 c8 Q
  33.         memset(recvBuf, 0, 100);) H9 H# G; z* \) x" Z9 a
  34.     }
    # i/ Q" [: ?. Q& D
  35.     closesocket(sockClient);
    / Z: I) N  N  R! B! J
  36.     system("pause");8 J, x. {$ I4 C, ~' m
  37.     return 0;5 _8 u" N# u+ [. I- e3 B1 }4 R
  38. }
复制代码
客户端代码:
: `& t; s+ J# {, g% G) K
  1. #include<winsock2.h>
    ) }% s( `, C2 k1 ]7 y! n
  2. #include<stdio.h>
    7 K' B' e) w# V9 I7 o! a; d
  3. #pragma comment(lib, "ws2_32.lib")
    - m9 g* ^8 s! [4 F6 `/ Q% R
  4. void main()
    - j: g* O6 V; Y& V/ ^
  5. {
    / u* L% |' I( j4 R$ o; M0 K
  6.     WSADATA wsaData;6 l, \0 x* E6 |! y
  7.     SOCKET sockClient;//客户端Socket/ ]9 D1 p5 R+ i  W2 ^! [; H. ^' Q/ k5 a
  8.     SOCKADDR_IN addrServer;//服务端地址% r  ?) y. P4 Y6 x8 F
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);! D! `. X/ u2 M$ K, B
  10.     char message[20] = "HelloSocket!";. X+ Q% H4 k7 u$ @$ V* y: V
  11.     //定义要连接的服务端地址5 Z% l- y3 R1 k
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    6 O( z3 a7 n& n% \) i
  13.     addrServer.sin_family = AF_INET;
    ( P: C/ B) m0 i
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ' J. G+ s- l& L( o( l0 [
  15.     //新建客户端socket2 y9 D% ?* H& z& v' y7 z; l
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);, T0 D  T: H/ q/ e
  17.     int s = 0;; ^" {. t6 a( m7 G% E6 E# B+ C
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));# M$ x* T% i; J/ _$ G

  19. ; e7 c* P; h4 @8 p# _' q
  20.     while (1){5 y) J9 s1 ?4 X3 r3 l: V7 j0 ~2 b; y
  21.         //发送数据1 x4 t0 o1 E( f: z
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);6 G1 z! _1 |+ m2 w* X
  23.         printf("to server:");
    , V+ F4 w% ~1 Z1 d% q% A( q; v5 P
  24.         scanf("%s", message);
    2 I% P5 D  W0 R) c) z+ _

  25. 1 C9 R+ M2 Y5 P* J4 w8 @
  26.     }( g, v- t; n  H* N% k1 \+ A" X
  27.     //关闭socket
      ?2 f, I' E4 e( P( v% P! A- S
  28.     closesocket(sockClient);& g0 [% E$ E/ p$ t5 J. Y
  29.     WSACleanup();  Z3 F$ h+ E/ |5 Z3 @  Z" |
  30. }
复制代码
求懂的高手来解答一下。8 [: u7 X& `* S# N5 Q" c" u, _
谢谢了!
, L( J$ A+ i# k/ l+ `3 A

4 H# v+ q8 q" p* K! y0 z$ r4 q6 s5 w+ P
5 U0 y6 h' I3 S& f& }  e# I5 {" Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 07:07 , Processed in 0.055382 second(s), 19 queries .

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