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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
# l1 U: [  h2 B1 H- t我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
/ m$ \! m, [. _& I# X6 Y4 r; jTalk is cheak , show me the code.
. l- H, s6 ?) d" }2 p服务端代码:
; S' b- t/ D8 K; L0 \8 u
  1. #include<stdlib.h>, A/ K7 n1 c& U* t, |2 a/ U
  2. #include<WinSock2.h>
    - x  i' U$ {) u" @2 a- t) a
  3. #pragma comment(lib,"ws2_32.lib")7 i* `1 M& ]3 f
  4. int main(){
    $ {( h. k  V/ Y  O8 |! r/ @
  5.     WSADATA wsd;5 A0 k/ q$ Q9 x0 K& d6 ]2 K
  6.     SOCKET sockServer;5 r0 C; c( [! x' I' a# r
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    $ o* z# u0 ?3 Y9 C7 E/ x8 v/ p
  8.     SOCKET sockClient;
    % [, g6 ^, g3 l9 I" ?% E$ R( D" x* J
  9.     SOCKADDR_IN clientaddr;5 a( ]+ ~% M/ ]# H- M0 u# F
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    0 F- I# x8 i9 w
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket& l" X9 S0 r2 W9 P3 I# E

  12. 1 D- a: c# F6 [! ^. j! p
  13. # [4 L- x" @" k0 T/ B
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
      K, d) W2 W5 W& |( Y! G8 {
  15.         printf("Socket has been created :%d", sockServer);8 l! g0 W& c: K. V  l
  16.     }
    $ h! r1 L9 h3 P
  17.     else{
    $ I* g3 `) `& u+ ]( f
  18.         printf("Socket create failed.");
    0 ^' g- V, f, w" k5 y0 T' l" N
  19.         exit(0);
    4 ?1 \: O+ b; V) d+ y
  20.     }
    4 A* J  b$ T# E' n
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; p% U+ v# y7 e, I9 j" S
  22.     serveraddr.sin_family = AF_INET;9 b7 K( `  K; |& N' G; j- P% y% ^
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    1 o) H) {% Z0 P
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));1 [) N% y. m, F
  25.     char recvBuf[100];
    " J+ {4 ]8 D' C
  26.     int len = sizeof(SOCKADDR);
    ( [. K1 J; w& `/ ^( C
  27.     listen(sockServer, 5);//5为等待连接数
    , ]+ m+ n* q3 W+ P/ V7 b
  28.     while (1){
    . H( W* d* m% {; d* s( |
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);5 P; C7 ?6 ^- p: F$ [6 }1 a" C7 _* e
  30.         //接收客户端数据; `9 f9 Z& x) s% k+ N7 \
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);8 z' O2 N& P& \' c
  32.         printf("to me:%s\n",recvBuf);& n( m" S" [$ t& k5 l/ t
  33.         memset(recvBuf, 0, 100);
    0 q( R9 n( |2 R' H/ `
  34.     }# ]6 Z4 g  b4 X3 v& E4 I6 N
  35.     closesocket(sockClient);6 G8 S6 E% Z+ G' O5 f" Z
  36.     system("pause");5 X( ]; _3 i& h
  37.     return 0;- J- A+ O+ [; a% ~# R5 y
  38. }
复制代码
客户端代码:
' C1 X% i$ J: u0 T
  1. #include<winsock2.h>
    ; v2 l/ q5 _, M, P2 z$ A) K8 Y+ E
  2. #include<stdio.h>& ~8 c. ]6 X, p: r8 k
  3. #pragma comment(lib, "ws2_32.lib")
    9 w% y# C: {1 K) h; a% h& X! B
  4. void main()
    ( V+ U. K6 e1 q) x  T, \
  5. {
    9 O5 A& R* M/ L* k" z% t
  6.     WSADATA wsaData;
    / C. I5 a9 q' K  y: F
  7.     SOCKET sockClient;//客户端Socket4 |7 J9 K5 F; j- U( b
  8.     SOCKADDR_IN addrServer;//服务端地址
    9 @" ]* f& t  ~& R& o9 F
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
      Y1 @# e' Z1 K. P
  10.     char message[20] = "HelloSocket!";7 Q  X( T1 {7 w1 J/ q, c0 Y7 u- K
  11.     //定义要连接的服务端地址
    & P; W8 e7 i! L6 [* F
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)) E7 R, r; |) _# k+ }
  13.     addrServer.sin_family = AF_INET;( i# r2 L( O% X* g/ D& X! A3 ~
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    $ {) y5 S. i7 E7 B5 [, {3 z2 r+ a
  15.     //新建客户端socket
    3 x6 S& s  g* V( ~1 [
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# h/ [0 d# e' U. j) D( d3 r4 B
  17.     int s = 0;$ d  m8 e' R. ^/ Y1 ~
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
      g$ q+ q2 o3 G7 e2 }; J! h2 o

  19. ( @& ~+ B( E" K
  20.     while (1){- M8 ?! p$ E( y4 r
  21.         //发送数据
    * q0 P$ {! w8 @5 K) f
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);4 [" U) @0 r2 Q4 ?+ I% t0 c) {: M
  23.         printf("to server:");9 ^0 K  g8 y$ X$ ]3 p
  24.         scanf("%s", message);
    " M7 h/ A% o" s: E) q

  25. 5 j$ Z4 D. ]& s  v! j5 c5 @1 ^. h
  26.     }
    ; R8 t' M( x$ Y0 W# k0 J
  27.     //关闭socket
    8 _) q9 b$ ^7 k" W8 v
  28.     closesocket(sockClient);: i" P/ U) x! B# a- \& N: t
  29.     WSACleanup();
    + ]  u# U1 e; U, h' v+ X  R
  30. }
复制代码
求懂的高手来解答一下。& k) V( z( [0 @6 s
谢谢了!
) _' H+ q/ j# ]/ g2 z" j
+ r' ]! _4 K2 `

+ D7 \8 s3 U' r& c0 r8 i9 x# y& g; c8 C# }

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为+ f+ I! J- m2 s- s, l5 P% o
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-6-19 19:41 , Processed in 0.050781 second(s), 18 queries .

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