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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11192|回复: 2
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。- Y1 v: s% c0 J" s9 O9 J
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 f' p' m* Z7 h& M/ K' DTalk is cheak , show me the code.6 v4 D) E0 K8 v! V2 l1 h1 ]
服务端代码:& B( P  U! M& U$ k+ e- b
  1. #include<stdlib.h>
    & N* |; _& z" A, I/ [2 u$ P
  2. #include<WinSock2.h>3 z4 B0 v* V% ]
  3. #pragma comment(lib,"ws2_32.lib")6 V$ n" d) W0 d0 q; y% I
  4. int main(){
    + A- S- |: W; F) [0 W: y) w9 v. K" I
  5.     WSADATA wsd;
    3 H: J+ q7 f0 u' {) c$ k
  6.     SOCKET sockServer;
    ' N' Z; M/ ~1 a' Z. N" O4 U
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号7 |: T2 M* C& t3 [# L7 m
  8.     SOCKET sockClient;
    0 l  Q5 P3 g" t. s1 P% M
  9.     SOCKADDR_IN clientaddr;
    , o0 K  G& ?: y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* ?3 D/ y* E& c, K7 q3 ~: |
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    - ]3 t; H* t4 ~* u( F

  12. * k7 Q, n; P3 s* R# B. m$ d

  13. / t) ]8 `/ [+ v2 {( t
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){" m1 r( l! i/ Z) Z  }4 w/ e
  15.         printf("Socket has been created :%d", sockServer);- i6 {. G+ C0 s) R( Q* |
  16.     }
    & W7 m/ w# d4 O  {2 ]. r6 m2 A
  17.     else{# q+ L# o0 b% ^. U* N1 R; @. U5 r
  18.         printf("Socket create failed.");
    : e8 [) Z' d$ s
  19.         exit(0);) L/ k' n5 h5 M9 f3 h$ R. U" k
  20.     }4 ~; ]: N1 o2 `- @$ N; V' ]9 G
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 H; X" }3 u7 V$ |+ p
  22.     serveraddr.sin_family = AF_INET;+ h' \$ e8 D8 v" K, e0 r6 w
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000' f' j+ n1 y9 a2 C. G7 a
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    5 |) g+ x8 c! V; T) b& O
  25.     char recvBuf[100];+ \- c) j3 s9 m$ y8 K
  26.     int len = sizeof(SOCKADDR);6 }4 \0 b9 m# J8 |5 |
  27.     listen(sockServer, 5);//5为等待连接数" l4 E/ d  p( F& ~, l  {$ A
  28.     while (1){
    5 {3 w' x. \2 d' y1 ^8 }
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);; `/ q4 i- p- h4 V5 M
  30.         //接收客户端数据# Z3 S( n. h& W  g
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);4 P2 r9 m  q% e/ x+ ?- Q& P- |# _
  32.         printf("to me:%s\n",recvBuf);  z; O6 b+ [0 h9 r
  33.         memset(recvBuf, 0, 100);5 r- v8 Q  t; v/ ]% R
  34.     }
    6 P1 ~; g  }! ^2 Y
  35.     closesocket(sockClient);/ w6 i, p  M9 _1 b
  36.     system("pause");, i# q8 W3 K8 V! H
  37.     return 0;
    4 h' n6 F% B. A0 |& `  }
  38. }
复制代码
客户端代码:& @8 E$ y6 k8 t
  1. #include<winsock2.h>
    2 C" r) G! M% ~) u9 J5 F
  2. #include<stdio.h>
    / |) d. ~9 p9 t
  3. #pragma comment(lib, "ws2_32.lib")& c) R! x. u+ U% s4 W9 p8 S$ ?# e; L
  4. void main()1 U' k4 j! G- A9 `( g- b
  5. {6 b& ^' T- v/ {2 A
  6.     WSADATA wsaData;
    3 a3 ?$ X) A3 L* g$ U/ D, z3 U
  7.     SOCKET sockClient;//客户端Socket
    % K/ H, i1 j/ n
  8.     SOCKADDR_IN addrServer;//服务端地址( P+ a- y# S* u4 C
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);8 Q& y; a! x) ?; h6 A1 s4 R9 N& S; }
  10.     char message[20] = "HelloSocket!";
    7 K) K- l' i9 L% t) R1 Q
  11.     //定义要连接的服务端地址8 x+ ^& K! q5 i- {* }8 n
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)- [3 c2 Q* [+ W$ v3 T( Y
  13.     addrServer.sin_family = AF_INET;
    : @) n7 d6 a, p% L* r
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    8 }& z. t0 j- f5 p3 l3 A
  15.     //新建客户端socket$ R5 C. E& b' U* F6 }
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);" j% M4 ?! x8 A  {
  17.     int s = 0;
    : U1 e2 w# j/ c% r: W6 S
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ) n+ j7 k& m0 L' F7 x

  19. ' {7 v9 [: I: \7 F: N5 f
  20.     while (1){
    , C" J8 [* v2 i% a) R
  21.         //发送数据' R! }) ]) e9 j) j& _) Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);7 M( F) y7 A- F  j- [3 n  x
  23.         printf("to server:");: r7 |3 V- G+ `0 J. Z+ c. U
  24.         scanf("%s", message);
    $ z8 P: }0 [0 K) r$ V$ f/ }3 A& o

  25. " H9 ~" o3 ^, ?: F- w
  26.     }$ @  x# i- Y9 k1 ^9 O
  27.     //关闭socket
    4 e+ T" a% y' `: w0 ]  [
  28.     closesocket(sockClient);
    / |2 Q  C0 c1 c. ^1 W/ O
  29.     WSACleanup();  I# u# {" w+ T: R: d
  30. }
复制代码
求懂的高手来解答一下。& N+ \8 B6 d: h' u6 ^- _5 p
谢谢了!. H3 n; O/ O0 t0 A. _5 w

  {+ l2 Z# {) S; O, G; e) Y! Y; Y' ~) A
! O0 R$ \( [' r, T) }1 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为# l4 k4 W7 q2 v! ?( m! q$ s
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-27 02:26 , Processed in 0.133087 second(s), 21 queries .

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