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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
: K8 T+ m6 u; ]5 h我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。  w3 t9 ^8 K6 u
Talk is cheak , show me the code.# a  y6 a7 d3 J' c  b
服务端代码:$ W7 x$ L* s- C  x- }
  1. #include<stdlib.h>. I4 ]- V7 |4 w3 {- F
  2. #include<WinSock2.h>" V8 j, z/ t" H1 l4 h8 ?$ i! F
  3. #pragma comment(lib,"ws2_32.lib")5 N2 _+ d2 n+ f& i6 ~7 `% f
  4. int main(){4 W0 J2 o1 K, i+ H, |! u
  5.     WSADATA wsd;
    * _0 l- G! @" o- r  W3 ?
  6.     SOCKET sockServer;5 m7 c, S- y1 x! X4 G: M
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    1 a) C- ~& p- U
  8.     SOCKET sockClient;6 ?( O6 U. h  M- ]
  9.     SOCKADDR_IN clientaddr;
    5 s* _  b9 N/ V% `0 ]' p
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    3 O8 d- G6 N  v8 W( C2 j( m
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ p: B% H( Q  V: @( @. u  @
  12. $ t5 m3 q! V* m5 N! Q. J
  13. + G$ U3 |; E' k" V7 [  W$ r
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; M* p, Y* b4 D* ?7 n  f. f' m
  15.         printf("Socket has been created :%d", sockServer);8 t8 j! z" D# Q$ y
  16.     }. j% {4 h1 p  U  {; c" E
  17.     else{0 A& A" Z/ d2 B: G2 b% i
  18.         printf("Socket create failed.");
    3 r; V7 ?! @& x+ U" }, T' @! l
  19.         exit(0);2 R( n4 R# \( l) a  |  R" o
  20.     }: |0 W" ?, o+ _2 p$ j
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. E7 p& ~" W- D0 T" a
  22.     serveraddr.sin_family = AF_INET;7 H# Q2 R4 _2 Y6 w0 t! H6 g5 o. ]. g
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000. }! H2 K; m" j; Q0 x7 w
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 m' S7 T" T5 c: r2 {$ d, E' {
  25.     char recvBuf[100];" F' ~8 m' u) x9 @% K$ C
  26.     int len = sizeof(SOCKADDR);/ ]' @: B$ q' p6 q9 }  I
  27.     listen(sockServer, 5);//5为等待连接数/ c4 O2 Q' d% ^0 i, \
  28.     while (1){
    4 A& [+ m6 w! l# E2 p! y
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);- j7 j. ^5 B  E1 R0 K( h0 C1 {
  30.         //接收客户端数据: k) @6 U' n- ]- A5 L5 L
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 a( K- a+ }5 g( n. p+ e
  32.         printf("to me:%s\n",recvBuf);
    6 Y' k' G1 t& o7 x$ ], x" A
  33.         memset(recvBuf, 0, 100);
    - r$ g. q* m+ v4 k" Q- j: k; f
  34.     }
    9 |2 i7 X4 c* @3 u1 ~
  35.     closesocket(sockClient);
    5 s9 B- ^9 G% @1 k
  36.     system("pause");
    , y4 g5 L+ r/ W* k
  37.     return 0;
    1 A! [  j, \3 O" I% I# l
  38. }
复制代码
客户端代码:: h+ p2 z2 Y) `+ u
  1. #include<winsock2.h>, J2 [: w% C( _
  2. #include<stdio.h>
    . l" L. w0 p4 }5 |  M5 s- g5 A) t; G
  3. #pragma comment(lib, "ws2_32.lib")0 `, Z  ~  |2 E6 K# u# @
  4. void main()7 X& ^, d+ }( @
  5. {2 l( G1 h! V3 w
  6.     WSADATA wsaData;
    1 F* T9 ~$ ?, [6 T
  7.     SOCKET sockClient;//客户端Socket$ ^0 Z- w: m- w& }3 e, T; {: i
  8.     SOCKADDR_IN addrServer;//服务端地址' o* i( Z5 d% @- u0 ]/ D% l
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);  O" Z% l4 s! a' q  ]3 {% t
  10.     char message[20] = "HelloSocket!";9 i4 t% i4 Z0 z' J6 s
  11.     //定义要连接的服务端地址9 f) T8 S- i; l% D4 }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    " r) G4 N! U2 G
  13.     addrServer.sin_family = AF_INET;
    0 w7 z# b3 h2 D- A0 @! d8 e! O# Q
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    # F0 `" ]5 I1 i5 G( j
  15.     //新建客户端socket
    % {& j! ~& Y9 E  F+ h
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ) M- d+ Q4 z! M8 `% A6 w  t
  17.     int s = 0;4 V, l6 e$ X0 ]- h" X" m
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));+ e3 Y+ v( e# N/ g1 e

  19. 7 f* t: Y8 T1 e$ ^( B
  20.     while (1){
    + S3 V! A; h& J6 Z8 E! {
  21.         //发送数据" I: S  U7 i6 I9 P& C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    0 J5 @) x  q, Y5 k! s
  23.         printf("to server:");3 t" q6 @& m7 X& X4 M4 n% ~) `
  24.         scanf("%s", message);; d/ ~. |3 n2 l- `3 V7 n4 o6 Y

  25. - N4 M2 B- N3 C  ?' d6 \
  26.     }& y6 _! F2 L) |+ R. H* ]
  27.     //关闭socket
    * G" F/ ]+ @& z7 `5 C, P' r% k7 B2 f
  28.     closesocket(sockClient);& r" ]$ f+ G7 B9 d
  29.     WSACleanup();* M, l, w9 g) S; k) V' Y
  30. }
复制代码
求懂的高手来解答一下。
' g  q1 N9 a6 P. z' Q8 b4 X' B谢谢了!
! a" S" U( S: w' ?' k
8 e$ c4 J" j3 K' a

; g, ?8 o6 l$ B- D/ d* ^6 j. o4 l
, R$ }  ~) G' V  u2 s( n+ @

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
, p( R/ x0 b2 f+ [5 b$ J% {8 qrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-9-20 23:08 , Processed in 0.061946 second(s), 18 queries .

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