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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
  e- V  @% ]) Q, p% E$ z1 u我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。  `( u! R0 z! N5 M
Talk is cheak , show me the code.* ~$ D( G5 N# T( B) A  F$ C
服务端代码:1 r  i$ d, F4 j% j
  1. #include<stdlib.h>3 a# O6 a* B- e$ X, E7 |! E
  2. #include<WinSock2.h>7 f! W/ x, M, \4 a$ M
  3. #pragma comment(lib,"ws2_32.lib")
    " p+ t* G" D) y6 |) o
  4. int main(){
    : y1 s+ [6 x- m0 P! p* s
  5.     WSADATA wsd;
    9 Q1 o/ |8 ]/ j" f+ [
  6.     SOCKET sockServer;+ G' r1 x6 N$ W# x
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号$ z! s  N: U' F- u* U
  8.     SOCKET sockClient;
    " }0 a7 p9 A6 U* G+ }
  9.     SOCKADDR_IN clientaddr;6 W$ ]3 e) M$ D% R0 j
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 T# Q2 R3 j# W2 L& i6 h. I
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    2 s9 h6 q: ], `  o' s2 @

  12. 0 D1 L7 T4 H, m9 G& L1 i5 w

  13. 5 T1 t( `7 H4 Z3 P% u1 H1 ~+ o. K
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    - h/ D7 ]1 `1 q) ~3 i' p
  15.         printf("Socket has been created :%d", sockServer);
    0 p' a6 v. w  ^/ ~
  16.     }% [  e$ z- X. p3 R3 o
  17.     else{
    " O6 x1 I  h' R: n* D4 }$ F
  18.         printf("Socket create failed.");4 U( ^2 m' U/ x  w0 J1 @
  19.         exit(0);  v$ K  N( ^! n5 U( s7 r6 R
  20.     }2 ]4 [0 n. M, C5 {" @' E
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    0 O/ y+ g# e8 n) e6 y. g
  22.     serveraddr.sin_family = AF_INET;
    / i  L8 R! j% M. a6 M( k
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    5 t- _: n/ v1 v0 W2 T
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 @$ `/ Y' P0 I3 z' a
  25.     char recvBuf[100];8 K- H  y/ ]6 \- A: M
  26.     int len = sizeof(SOCKADDR);- z* u6 i7 P9 Y2 E4 B
  27.     listen(sockServer, 5);//5为等待连接数* j9 ~9 g- Q6 a/ I" g
  28.     while (1){( I5 X8 Y) c1 _' k
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    1 ~% Z0 h+ r  c- W3 `* A
  30.         //接收客户端数据
    % j4 A+ m1 }0 H5 R3 b
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);: c) {0 a: s3 `7 w
  32.         printf("to me:%s\n",recvBuf);2 ^7 ?6 r( S& g8 l1 N; ]
  33.         memset(recvBuf, 0, 100);9 F* g1 G( R, n3 I/ F5 X
  34.     }
    ) ]/ G, G6 j" |$ k! \1 C8 }
  35.     closesocket(sockClient);
    ! s6 ]3 q- a9 E
  36.     system("pause");6 ]. {& r- I$ h! R7 L5 W6 W  R
  37.     return 0;5 f* Y  K. |4 B( N3 N" m& S( M
  38. }
复制代码
客户端代码:
! v# A  T, J  @) Q5 j
  1. #include<winsock2.h>" c# I6 F9 y* ]$ r+ G% S
  2. #include<stdio.h>
    ; o& J+ j7 u8 f4 W1 {4 [0 V3 }
  3. #pragma comment(lib, "ws2_32.lib")
    1 f. F$ B$ L" R+ M( {6 \
  4. void main()- K; t! i. Y, F1 O$ ~6 v
  5. {( h8 S/ |4 \; u7 [: {
  6.     WSADATA wsaData;4 v) z9 c) x8 w
  7.     SOCKET sockClient;//客户端Socket
    1 l) l" |. t" |0 p8 G) L
  8.     SOCKADDR_IN addrServer;//服务端地址" o8 g9 d; ^5 }9 z% Z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    0 r& {' \6 `! M6 }  M
  10.     char message[20] = "HelloSocket!";5 R0 E7 J$ h1 i& s% S( \
  11.     //定义要连接的服务端地址8 e) N1 `& [$ W8 }+ _
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址): d* |* h+ Z, p4 y/ L
  13.     addrServer.sin_family = AF_INET;
    2 S) \2 f( q; u! ~7 @
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    8 U% {; X, ]4 k
  15.     //新建客户端socket
    1 L) |- I9 B; E. T5 e: T, f& k( N, a
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    - w  U& G$ O# v: W
  17.     int s = 0;2 O  p# j2 N" Y  G- u) X
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: l0 _) z8 {; z
  19. ) P( }9 ?' B( ]0 p3 C( f# c
  20.     while (1){
    + A$ `5 M# D+ [( \0 P$ j4 l( D  Y5 Z
  21.         //发送数据2 Q" f' S1 P0 h3 ?
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);& y2 A: R) h" W9 L; ~; g4 L
  23.         printf("to server:");
    ) O7 b+ o2 J  M7 W' R. J' G0 B* r
  24.         scanf("%s", message);
    0 y$ G( `# ~9 F3 Y6 m3 p

  25. 0 Q/ M. x( F( t6 q; r: }) V
  26.     }, ^7 z7 Y- Z) ?7 p8 b
  27.     //关闭socket
    ; u; g0 m/ b% t" y% X
  28.     closesocket(sockClient);
    , }; T6 \3 a' W# m) h$ z# _
  29.     WSACleanup();% R, F6 e' C7 m+ B4 |
  30. }
复制代码
求懂的高手来解答一下。! H" j- s' a  C/ D  A  C
谢谢了!* \6 a" C% y/ L1 A; H
& U5 T- C- O& q+ z, Q; y# G& T; _0 X
- o8 A% S* _" B+ ~* E
+ Z) c, m! c! ~1 i$ A

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为4 M3 b5 U  B/ {, e$ u0 ?# v- h
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-9-21 03:12 , Processed in 0.052248 second(s), 18 queries .

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