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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。5 x8 G+ D: ?$ X4 t9 V$ N' U# l. _
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ h5 ?  b/ D' M
Talk is cheak , show me the code.
) V: A9 G" L& G. j  D( G7 N服务端代码:
( {/ A0 t' [' i) c& \+ `
  1. #include<stdlib.h>
    . O4 l& P' n1 _
  2. #include<WinSock2.h>
    0 k: ~$ g" m5 k( [
  3. #pragma comment(lib,"ws2_32.lib")5 k+ y2 u7 M1 J$ U. r: z+ z
  4. int main(){
    ( a6 Y3 e; ?- m
  5.     WSADATA wsd;
    # C( \. }: V. x) m, N9 h+ U7 ~0 Z, T& G
  6.     SOCKET sockServer;
    % j. \1 A9 a7 i) T
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号: B8 J& g* {1 w: J  B$ v/ t4 n
  8.     SOCKET sockClient;
    . v1 b/ u  D4 T7 ]
  9.     SOCKADDR_IN clientaddr;
    . Q& M& F& T4 S! v
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口, `# x5 m% l  D7 g
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket! R% j, T" E1 V/ a2 @+ T
  12. 0 q/ M& \6 g% I' a* c2 |
  13. 9 c" [0 N3 Z- R! J  F# `
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){% u6 B' Q2 r2 y) G1 ~
  15.         printf("Socket has been created :%d", sockServer);% {( E; L9 }3 h' j2 v  ?
  16.     }
    5 ^; `+ s( r" j1 Z
  17.     else{- W6 ~, o3 L+ w
  18.         printf("Socket create failed.");
    / q& N9 u, B! f# r) I  V5 {
  19.         exit(0);6 s( ]6 m( }4 z/ X0 s. Y
  20.     }
    ; r3 v4 D. g1 \* N  X+ H
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ) r4 a: v7 ?5 K6 `* Z4 |! R0 }
  22.     serveraddr.sin_family = AF_INET;
    ; g% {/ p7 o9 }; K
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000, C2 m, T& i3 m  L. h4 X
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));, ]7 F" c1 B1 Q) e3 ^
  25.     char recvBuf[100];
    , ^& [' @+ d. z
  26.     int len = sizeof(SOCKADDR);6 Z! ~3 {! d+ O5 {2 j
  27.     listen(sockServer, 5);//5为等待连接数
      @  i' F5 Q8 c. n  ?) B* u
  28.     while (1){' D5 E; i- ], Q+ R
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    & I# z, y1 u3 F) T! k' O) D
  30.         //接收客户端数据
    * Y' S' N* o0 G% a5 c2 q# j$ k$ T
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    7 G/ E7 S, p/ j4 G0 o2 O2 q2 f9 j" c
  32.         printf("to me:%s\n",recvBuf);  W. f, \# y+ \; G8 |9 s) v# A
  33.         memset(recvBuf, 0, 100);$ f5 l! ~& V4 F1 _3 u/ l$ V
  34.     }6 O4 b: e7 V  s  p# \0 W
  35.     closesocket(sockClient);; i' Z* h. v! i
  36.     system("pause");1 O  \  L* `$ h
  37.     return 0;3 H  D1 B' A' i. A: w! p
  38. }
复制代码
客户端代码:
. ^3 |/ ]* {8 v
  1. #include<winsock2.h>: S4 J6 q' F% l+ ?
  2. #include<stdio.h>
    ( f4 j( M) V: V3 p6 R8 @2 o
  3. #pragma comment(lib, "ws2_32.lib")/ U% s- w. E9 k
  4. void main()
    " A/ I1 z7 J, Z3 r
  5. {' w4 f5 F- ?+ r7 l5 v. y2 z1 s
  6.     WSADATA wsaData;( G+ V3 ^- V3 E0 H6 o# V5 {4 K
  7.     SOCKET sockClient;//客户端Socket# k5 M/ y! Y* ]4 y
  8.     SOCKADDR_IN addrServer;//服务端地址
    : l. T6 A8 x, G8 x( J
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    - a8 T0 ~. t9 E! g! e/ u* |
  10.     char message[20] = "HelloSocket!";
    - ~9 \( o; `' G. V4 S' y" ~
  11.     //定义要连接的服务端地址
    / O9 A! X# U6 W! s! k
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& b5 @+ U5 s: u
  13.     addrServer.sin_family = AF_INET;
    ; l! Z$ z( z6 N. P: e
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % [4 E2 ^5 n5 h# ~  i% c
  15.     //新建客户端socket
    $ R$ N# C( C! R
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    # w$ b$ N/ y# V, |
  17.     int s = 0;$ N0 U) J/ v& H& A% S# I8 r, ~
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    * R* m9 G9 o% V( M6 w4 Q/ |: z
  19. $ g' i  J7 ], N, [  H) k# L
  20.     while (1){
    0 L4 y2 ?4 H! o, g
  21.         //发送数据0 R- u) C) i) Y# l
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    0 {1 m) R) A" k$ U5 _' I+ E
  23.         printf("to server:");
    + _) _5 @9 u! Q8 i7 g
  24.         scanf("%s", message);9 \. Y: P3 G. K9 ?" c* A8 G
  25. " K# s5 z4 J) K
  26.     }" w' T: l4 H- g& o
  27.     //关闭socket! W/ A3 d  l/ Y- w* u' z! A8 u7 K
  28.     closesocket(sockClient);0 W6 d# h3 X- B1 `% Q
  29.     WSACleanup();% {- p1 H3 f! q! R2 K
  30. }
复制代码
求懂的高手来解答一下。
4 a8 r# B1 G% k谢谢了!6 `+ l: K9 c7 W* N* H7 O
- z' a; J7 P3 @9 ~: c
* f3 q7 j5 H9 P; _- @8 @) B9 |

0 z4 q" @% y8 D& `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为- H. f( q0 U  z* {
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-19 22:24 , Processed in 0.061081 second(s), 18 queries .

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