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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。3 z5 \" k5 Q! i7 U) v  e! `! s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。  i; g3 i  [2 t
Talk is cheak , show me the code.; F, Y& j* Q3 c
服务端代码:
2 U) a9 k& A6 R
  1. #include<stdlib.h>
    4 ?- r% _: z" l2 q, [, e
  2. #include<WinSock2.h>
    / ^. T  k( Y9 Z8 c
  3. #pragma comment(lib,"ws2_32.lib")
    2 O4 S$ K7 T* c3 S) N
  4. int main(){
    0 r5 X) w& U( T$ l% V" a
  5.     WSADATA wsd;& ~) h: x" \# g/ h
  6.     SOCKET sockServer;
      G( J0 r2 B+ ]9 D
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    # }7 `& q5 t6 L+ e' m9 t2 o
  8.     SOCKET sockClient;
    0 [2 N6 T/ M  W
  9.     SOCKADDR_IN clientaddr;! F) t0 u" Z" k0 ?
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    1 v2 N0 f0 D# `" ?, X/ K$ y% T
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    5 @; ^8 e% U1 `; L3 l, V' L' \+ A' u
  12. 4 N0 |5 m& O6 h5 c

  13. 8 d" \) F  p. {% k: z7 |+ a
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){1 v: f6 P: h% K) ~, K  I
  15.         printf("Socket has been created :%d", sockServer);1 [5 j( q$ S  I7 A( V
  16.     }
    8 W7 e$ h! i, v8 X1 n. V+ F# E0 ]
  17.     else{
    # i2 ^- F0 l! ~/ `. V$ Y
  18.         printf("Socket create failed.");6 n  l) O. h" z3 U3 H) \
  19.         exit(0);' m* c+ X9 r& V8 r# {% ~
  20.     }
    4 [* g$ l; n; x# T2 _, j) v- s5 w
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);& m3 }6 a. V2 h9 u$ i) j4 y3 t7 x
  22.     serveraddr.sin_family = AF_INET;
    - x6 b. q7 n$ I3 P0 }7 G1 B9 N
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    8 ?: f7 y+ b, f: n) ]
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));1 f, Q4 C+ y7 S  ~  I& P
  25.     char recvBuf[100];
    / v- l  p8 v; q# B
  26.     int len = sizeof(SOCKADDR);+ i' C1 J% k3 G( X: s2 p7 g
  27.     listen(sockServer, 5);//5为等待连接数) e& Z4 |! ~/ s4 o# t
  28.     while (1){' H, ?/ `8 V1 Q9 k  H+ A
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);% ?: `( r$ ^' |
  30.         //接收客户端数据0 [+ R; W& J1 u* J: X
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    - y) f' w6 i- J* I9 N: z, w, V
  32.         printf("to me:%s\n",recvBuf);) g4 s2 A' [/ H) M+ y
  33.         memset(recvBuf, 0, 100);0 Z& a( T( ^( R/ w& U) \
  34.     }
    6 J" [6 A* e% s2 u& S  H
  35.     closesocket(sockClient);
    8 ]& R% k3 A' c- u# D! ]; G
  36.     system("pause");4 b, {/ c: {8 E# K! G
  37.     return 0;
    5 e; A; X( [6 U
  38. }
复制代码
客户端代码:
% S4 l9 a! S# h" [$ s0 S
  1. #include<winsock2.h>2 X$ V' b! X& h' r8 `# p7 M* q
  2. #include<stdio.h>4 _; V9 O, O% T, o( d
  3. #pragma comment(lib, "ws2_32.lib")" u+ o& e( H* O/ t
  4. void main()6 d  t( N( b+ o) F
  5. {0 ]5 {- F+ }5 T% k1 P2 z
  6.     WSADATA wsaData;
    4 o; N- `2 m5 z+ z: N: E1 g
  7.     SOCKET sockClient;//客户端Socket
    % }% M0 z% o+ {
  8.     SOCKADDR_IN addrServer;//服务端地址
    9 d' Q7 ]: }2 {
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    7 n, H8 H, q7 s+ W# p# q
  10.     char message[20] = "HelloSocket!";
    ! r& S0 K9 Y& T7 t6 s. X
  11.     //定义要连接的服务端地址1 T: t1 u! x* M$ `) L+ u5 |9 {
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    + r/ C6 ]7 }# I$ N$ I% j  w
  13.     addrServer.sin_family = AF_INET;
    + c' K$ ?* @2 \" b7 {
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    9 C: p6 U% Z3 U0 T, J9 A* o
  15.     //新建客户端socket5 _, Y! q* H! X3 i) t7 N
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);) j9 ^1 s3 v3 _. y6 M4 J
  17.     int s = 0;
    ; d2 A0 i$ \5 |
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    , x: s* I. ~" W
  19. 6 g, m, t: d- \6 ]. z: M1 |: D
  20.     while (1){
    2 [+ l$ R! Q5 B
  21.         //发送数据
    / H+ q* g: c& i+ d2 w
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    - Z1 y1 `; m. t' Y9 j1 C& P
  23.         printf("to server:");
    ( s# T0 V' }) t7 S
  24.         scanf("%s", message);* \$ }1 y# @8 Z

  25. " l! a+ C7 L9 ]' E: }" H' Q
  26.     }
    ; Z  z/ w0 N7 I
  27.     //关闭socket
    & U) Y: E0 j  u
  28.     closesocket(sockClient);
    4 k. @" ]- ~# Z- `9 P; B
  29.     WSACleanup();
    9 u9 u, Z! a) b( T
  30. }
复制代码
求懂的高手来解答一下。
7 M' M* u# ^( P5 {谢谢了!" e# e: Q" b: X

4 E$ Z% ]1 O+ z. x8 c+ b% S* k- {4 ~  j1 G1 R1 j! h
4 \# f" s. m0 M! p* E' ~) P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为  K8 m! h* i/ I4 {7 O
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-5 18:59 , Processed in 0.130355 second(s), 20 queries .

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