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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
! t& U" F8 _4 |7 O2 I我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
- z7 J) f# M6 j+ F$ \Talk is cheak , show me the code.$ m5 G3 x4 g' D+ _2 p
服务端代码:! D; E4 W2 q  o$ B# J
  1. #include<stdlib.h>, Q5 t$ f0 [$ U1 j) N
  2. #include<WinSock2.h>
    : A0 _$ V: h# a7 ~% [8 f% o+ B
  3. #pragma comment(lib,"ws2_32.lib")
    , f" [6 |. l. Z! k9 |
  4. int main(){, g" v8 E+ P6 {. @$ B; R
  5.     WSADATA wsd;
    " K$ Y! @* k# S0 B' a
  6.     SOCKET sockServer;6 x  d5 D+ t% I  Z( u, {5 u# G
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
      N) d! U4 ?/ g/ `
  8.     SOCKET sockClient;
    # j" S( U  S$ @5 q
  9.     SOCKADDR_IN clientaddr;
    ( |; r; K: R9 b  M, X* H% I
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 x% [3 t2 u, k# E" n9 c3 V, ?2 t
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket9 s" g/ z/ z7 ~/ P2 n, N* G
  12. 5 o/ W! L- Y4 v& D+ Y& V( b# L

  13.   V5 l+ ~7 N2 V7 ^, S, P' x
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){" j0 m2 c4 c/ L
  15.         printf("Socket has been created :%d", sockServer);
    8 P% b4 D" M3 ~, e! H
  16.     }  p2 ?7 L4 k$ y9 Q
  17.     else{
    3 O4 W7 t( a/ g9 ~0 c  r
  18.         printf("Socket create failed.");' M: Z3 P+ b6 K& I3 \4 c
  19.         exit(0);7 c4 o4 E& [+ u9 V: K: M) H( ?
  20.     }2 X1 ?7 Z6 _  q- H/ N
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    + V9 w8 \4 [7 U% \7 e" m
  22.     serveraddr.sin_family = AF_INET;
    4 U/ e1 ^# s/ v1 R' G- Z4 E! i
  23.     serveraddr.sin_port = htons(6000);//绑定端口60007 F9 d6 I' `7 Q* s; ]
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));0 z1 z6 X2 v% R
  25.     char recvBuf[100];
    + L, l9 F/ N" k* F) s. k/ k$ u
  26.     int len = sizeof(SOCKADDR);' ~2 n9 W* h6 }0 f- k' b2 G
  27.     listen(sockServer, 5);//5为等待连接数
    ( c/ ]- b: r" |& V7 O7 l
  28.     while (1){
    ; o2 e9 |" L9 R& K, L, @; k4 d7 O
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ( _" g4 R- V- ?3 ~3 ^
  30.         //接收客户端数据
    ( n0 V0 Q/ l& [* V( }/ A
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);6 S, j2 X. I6 h! p4 \* q, h( Q
  32.         printf("to me:%s\n",recvBuf);* v4 k. X1 M' t6 Z2 A; u% S
  33.         memset(recvBuf, 0, 100);
    6 p  Y. |8 J1 @9 l5 I2 i* G1 @: c
  34.     }
    + u: L- B& y3 [" `3 `4 [/ |
  35.     closesocket(sockClient);/ r3 _0 d, ^' e' o/ a
  36.     system("pause");
    9 A! K8 @  z$ o& N& f
  37.     return 0;- H" Z' F$ d6 T: d
  38. }
复制代码
客户端代码:
% }4 r' ^* g8 I( ]
  1. #include<winsock2.h>" Q& U5 _/ ?7 `3 I( R
  2. #include<stdio.h>! o+ P& G$ S/ a# U7 c
  3. #pragma comment(lib, "ws2_32.lib")$ H7 Y1 j4 b' q: i, N
  4. void main()
    , Y) W& d! @- o5 w
  5. {0 q; X' ]! I* S0 r- J$ L# t, i, J. v
  6.     WSADATA wsaData;3 s. Z9 v0 b' a7 M
  7.     SOCKET sockClient;//客户端Socket
      P% K, ~3 e( i, ?# d6 Z+ z$ o6 u- P7 R
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ h6 X  Z/ V+ D9 F2 h
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) ^( T8 [2 k1 A) h$ n
  10.     char message[20] = "HelloSocket!";# W" g9 C6 R4 j- U$ _" z
  11.     //定义要连接的服务端地址" M, K4 I- {! L
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址). F( n& [( o3 R/ _# s( i7 w
  13.     addrServer.sin_family = AF_INET;. F8 Z& c3 H1 U
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    - q$ I% U: K/ `0 N+ M
  15.     //新建客户端socket7 K# [4 P( t( u0 F: q. e
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* ^( o% Z8 M3 A! e1 O
  17.     int s = 0;2 x7 i" G+ q3 }
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ! `  c# C. u) q# a  v: n

  19. 2 E8 ~% F' B3 _$ A" B" e$ L  x
  20.     while (1){
    7 n6 O1 E9 |( f- L
  21.         //发送数据3 h0 n2 r8 `; L% c! |) Q! F
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);! B8 V) K# d" p0 K
  23.         printf("to server:");
    $ L% z5 g* ^" X: V5 Y4 x
  24.         scanf("%s", message);; N( a* l  h. g* M) q

  25. * Q3 U; p; G  A
  26.     }1 r) V: q: W+ v9 P0 [0 |1 F" x4 L! ~
  27.     //关闭socket& l4 n* l) ?9 k, n; X
  28.     closesocket(sockClient);3 U! h  J5 O/ b
  29.     WSACleanup();6 E6 o* ~$ F) |; ~  Q" B) ^: X2 s
  30. }
复制代码
求懂的高手来解答一下。
! l* P/ r* Z7 l  y# I" q谢谢了!; |) Z' d, E/ f- f: P

) Z7 [! a( A! f  R' @
0 M) }! g( M+ G- o* ~  F2 O9 g- ~7 S, q

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为2 R4 R) U4 C' }9 F9 q
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-5-2 11:46 , Processed in 0.053805 second(s), 18 queries .

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