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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 › 门户 › 查看主题

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

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

大家好,感谢你的回复。" a9 |" a) ~4 `( n, n) p
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
. g8 C2 }3 U0 s0 {5 z1 ^! [8 d% N( _Talk is cheak , show me the code.* n( K6 C8 w; B, |5 T$ g& S6 F* W
服务端代码:
) w+ }2 p* M, Z+ l. V! c8 o
  1. #include<stdlib.h>* J, o* p' t0 ], H# @
  2. #include<WinSock2.h>
    ; o; |+ ^$ y$ Y' c% ], @
  3. #pragma comment(lib,"ws2_32.lib"). ~* }5 q6 Z. ~
  4. int main(){  H2 J0 G1 E+ z; Y2 P" q: B7 D
  5.     WSADATA wsd;. ~- o& j0 D: s. H, Z
  6.     SOCKET sockServer;
    1 q0 Q0 {/ G9 `- H2 G- Z; M9 q9 N
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    8 u+ C$ c# C' C* q
  8.     SOCKET sockClient;
    + ^* l' n4 C) `  S. [3 |
  9.     SOCKADDR_IN clientaddr;
    * o/ ?) ^) N3 z" _9 R- u
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口' i- l% O1 a& ]' ]+ o( P' L
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ( s" d! U4 |( j# y8 k
  12. ' S% \  z; }: [* [) \; s" [7 Q
  13. 0 W* {# [6 H" O$ _  B! V; \9 O4 O
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    0 h  \6 p- d& ]# c% s5 M8 s
  15.         printf("Socket has been created :%d", sockServer);
    & P$ z9 y8 r1 W! J% P! D- L
  16.     }4 q9 H( Z, h3 r) @/ b
  17.     else{+ Y& M9 g% h) R0 Y$ h1 z4 A
  18.         printf("Socket create failed.");& d; G2 X1 y: s7 L- X5 D' l
  19.         exit(0);
    * i, `3 j6 N1 I0 b4 C+ S
  20.     }: t; ~( o; M' n) N2 B" e
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);, f8 c4 Z/ r! [" X8 e# ]
  22.     serveraddr.sin_family = AF_INET;
    8 L" \3 M$ p7 m' Y; [
  23.     serveraddr.sin_port = htons(6000);//绑定端口60001 J0 l" C5 x% `
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));, W9 j: @. M5 E4 T4 ]
  25.     char recvBuf[100];! o& Q5 |- r6 j* y
  26.     int len = sizeof(SOCKADDR);0 ^. e2 h  C5 i+ G  O+ D
  27.     listen(sockServer, 5);//5为等待连接数
    / p1 ~3 W6 X" N6 ?0 E. t* U7 K4 h" H; V
  28.     while (1){
    7 Q% V4 b6 z% u
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ( Y& V: Q1 W  j, q4 r
  30.         //接收客户端数据
    9 N8 \7 U4 V; Q$ W8 y1 b
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ; E9 t2 T- v: Z4 u+ H* p
  32.         printf("to me:%s\n",recvBuf);! H  {( V. s* O7 c0 R
  33.         memset(recvBuf, 0, 100);
    5 }& R8 l' K" |' B4 O7 Y) ^" B
  34.     }
    2 \' H1 U: m; a% ^% X6 l! O
  35.     closesocket(sockClient);  f% O  K; a. D- M0 w3 ^
  36.     system("pause");
    5 t+ \; W2 a% ]$ e: Q
  37.     return 0;
    + u2 o4 n$ A, t  s- r' t+ c8 Q
  38. }
复制代码
客户端代码:: X  c3 d# D& Y7 g1 Z
  1. #include<winsock2.h>
    ! L! i9 L; G$ ]+ q  n" @) B
  2. #include<stdio.h>
    ( n6 m: K; S+ r
  3. #pragma comment(lib, "ws2_32.lib")
    / Q; b: S! K% w* }$ N. M
  4. void main()
    # e% A$ h. o1 s8 E' W" b8 F
  5. {
    0 C) _; D4 O% o. H( y
  6.     WSADATA wsaData;4 x: H/ I9 k' V6 Z. R5 E' Q' t
  7.     SOCKET sockClient;//客户端Socket
    - _4 V% v- p7 {1 A+ B8 b
  8.     SOCKADDR_IN addrServer;//服务端地址% l% ~: U/ A0 m
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    8 x4 U7 p' R- ?  c6 Y9 T5 ]  b+ b
  10.     char message[20] = "HelloSocket!";( @6 H) B) n8 b# N
  11.     //定义要连接的服务端地址
    / w+ M2 d1 D1 s1 ^& S3 G) d: }: b
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    , ^9 q4 [) R- I
  13.     addrServer.sin_family = AF_INET;! f7 M9 B+ q- y9 z/ X0 S1 j  u
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    , H6 p) `9 J8 T# d0 s2 n6 v' D0 l5 }
  15.     //新建客户端socket" M: p: [: I- v
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);5 G. U$ R0 v: m2 R2 a2 q: d
  17.     int s = 0;+ F5 @, ]. I9 a, q# |
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    - v# \" w5 O4 @4 ~6 Y8 g. W- k- H: g
  19.   C$ h* }* x8 Y
  20.     while (1){
    " ~3 N2 Y" ~1 ~7 O) l3 [; ~( g
  21.         //发送数据
    : b$ G/ Z7 |* K  A; Q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ; l5 Q7 [4 n6 [; q' g
  23.         printf("to server:");
    + f, x: `/ U% A4 P, o: L
  24.         scanf("%s", message);
    6 ]) c2 k7 Y! E% _

  25. . Q' p, ~0 q' m. I' V
  26.     }  N$ j, a" y% |3 I% K# Y, G: `
  27.     //关闭socket3 d7 U( _! I& b- E1 v
  28.     closesocket(sockClient);
    8 p' |2 b/ Q5 E8 S. B
  29.     WSACleanup();1 `: N! l' `8 q/ r# e/ U
  30. }
复制代码
求懂的高手来解答一下。  D; e+ U( a) _+ l7 Q
谢谢了!% y7 `! ^4 B* |, e

/ b! G7 K5 K# G; p& R* I1 N9 Y  X
7 Z. u$ m' A  ^  R- _6 m

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
6 q/ O( c3 Y0 L/ Precv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-10-11 23:27 , Processed in 0.058383 second(s), 19 queries .

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