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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
  V( O' j: W& F6 C我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。# y. N, R# g5 j  v
Talk is cheak , show me the code.
, n- @6 R3 i! O7 ~/ t+ N服务端代码:
, e9 N' n3 ?# z3 _
  1. #include<stdlib.h>, b/ `0 L% F* x& g' J* i
  2. #include<WinSock2.h>
    / N# ?( s: G' Z# X' b
  3. #pragma comment(lib,"ws2_32.lib")8 `7 F1 e4 e4 U8 |+ b! C6 A3 i; d
  4. int main(){! i2 p* B" R( a0 h, r
  5.     WSADATA wsd;
    * O) D+ Y* e5 ~( p, Z
  6.     SOCKET sockServer;6 c7 G# P  _. I
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号# w/ e! ?; _- X( H0 L
  8.     SOCKET sockClient;
    7 u, I6 s* R! Q/ A6 J
  9.     SOCKADDR_IN clientaddr;
    $ l/ ^4 P/ S3 \4 S+ m6 q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    $ N, R' N8 O( P0 H, ]
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 {8 j! V, m$ a2 I, U
  12. 7 u, S, k( x9 [# w& s
  13. 7 B) ~( g6 q  T* N& d' E: S; h
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    - ^& \; u8 T& t: v
  15.         printf("Socket has been created :%d", sockServer);$ m$ l. C" p+ p$ W% c/ Z' ~
  16.     }2 N0 K4 N+ a9 Y* P1 ]8 s2 n9 J
  17.     else{
    + ?1 [3 F! }- I- R6 b/ k9 r5 y
  18.         printf("Socket create failed.");  z. J5 B. e. y& t6 G9 f4 o; p
  19.         exit(0);8 O5 t* k- F: I
  20.     }: w5 z% b0 ?4 Z5 S
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    8 @' E+ T9 b' B
  22.     serveraddr.sin_family = AF_INET;1 N' x" Z0 W3 A% O8 z
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ( U! r6 s, o' e& X: u* q* j
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    * b. d/ A- {$ p6 d+ S
  25.     char recvBuf[100];
    ' r. T* p. f/ Y$ O
  26.     int len = sizeof(SOCKADDR);) \, |0 O+ @% t, ?8 a& d( K# r
  27.     listen(sockServer, 5);//5为等待连接数
    1 n$ s  U& [& K3 f; Y6 f/ U; k) [
  28.     while (1){& y. t' d  ~( Q4 B" T1 v
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    : m9 i/ \4 F' [
  30.         //接收客户端数据# B# S, P. z- W
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% U6 k. f- H( T* L* d% s. \. j
  32.         printf("to me:%s\n",recvBuf);% V4 w4 U2 E. @! a) B7 H0 d6 G
  33.         memset(recvBuf, 0, 100);
    ! }: j! n' [9 f
  34.     }
    $ `+ \- Y1 C' k
  35.     closesocket(sockClient);; O, @- S, z- Z; _; F- `  G
  36.     system("pause");
    # ?% _- s) a& ^8 W
  37.     return 0;
    ) O& Z" ?8 U) v; P" ~! F, ]$ w& n
  38. }
复制代码
客户端代码:
) q- h' h, `+ Y+ }6 X: p2 f# J
  1. #include<winsock2.h>
    & `# y6 j& U1 l$ B
  2. #include<stdio.h>
    9 S7 N/ w" j* h$ }
  3. #pragma comment(lib, "ws2_32.lib")
    8 j% w) R; S' C! [2 w
  4. void main()
    $ C+ m8 B3 E5 h! ]' N
  5. {
    $ y( x1 \/ h/ Q2 Q, o
  6.     WSADATA wsaData;
    7 g" j, `" R& P
  7.     SOCKET sockClient;//客户端Socket
    ! c. G* w- C7 s/ M$ M  ?$ ]
  8.     SOCKADDR_IN addrServer;//服务端地址
    % a' ?  f- v- J( i
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);. h0 V7 l9 D) k% s" P
  10.     char message[20] = "HelloSocket!";
    ' ~/ |! B* B! d1 p
  11.     //定义要连接的服务端地址
      m9 ~( I, |$ {3 p. b
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    % D$ W6 j4 ^; X, Y  A% I9 h
  13.     addrServer.sin_family = AF_INET;
    ) X7 W- y0 r' ?7 g- q: }* H0 t
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ( o5 b2 J' o$ J) _
  15.     //新建客户端socket' m- a6 x8 b) p, c- n4 k- M
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* I  D7 I3 e" j* s
  17.     int s = 0;3 Y9 b1 r1 m+ {
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: X) @1 B# M0 Y* l9 g

  19. / M+ x( `* r1 Q' Y1 p. M1 a
  20.     while (1){
    4 k- q  S- d+ m+ q. ^3 O, r
  21.         //发送数据
    ) s. l. \$ z0 t( P7 G! x
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);0 }2 G- a  ?5 @3 t. J% U
  23.         printf("to server:");
    - @( F4 T& {5 Q  K/ P9 h
  24.         scanf("%s", message);- I3 N) e) D$ _

  25. 2 m+ _/ N6 g' d( O
  26.     }
    9 j: L3 |) g/ c$ G$ P4 y0 z
  27.     //关闭socket+ N8 B1 ^( }, c! s( K1 |
  28.     closesocket(sockClient);
    8 Y: v4 H5 u* \6 V* f1 D4 b
  29.     WSACleanup();; e# }) a2 t5 \
  30. }
复制代码
求懂的高手来解答一下。7 `2 A* n1 [4 x. g! L! d$ g
谢谢了!( V( N- z% l: Q: D+ P2 q, b

) S: L3 |4 a3 b! n  R! j0 W  S' g5 ]& |9 c
# [( N4 o5 r2 \% u$ i) d

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为" b. A! ?9 [! \3 W* \
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-7-15 15:23 , Processed in 0.056062 second(s), 21 queries .

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