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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
. N; r* Y, \! s5 H+ |1 H我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。& g8 |" z* x% g; B9 I: K. [
Talk is cheak , show me the code.
2 `" Q/ X. O* f; v5 {服务端代码:" ^' N% l8 E, O% A" p4 y: ?
  1. #include<stdlib.h>% m  r/ u4 w1 e) i- w, k; R% D
  2. #include<WinSock2.h>
    * n! u* A1 ]. e/ e* N# n. L/ b
  3. #pragma comment(lib,"ws2_32.lib")) {/ Q" i2 {% u& e: D# }
  4. int main(){1 g6 i, A9 F+ ^- j1 h, {
  5.     WSADATA wsd;& {% }/ b" g9 X2 B9 X  U) D
  6.     SOCKET sockServer;
    0 [$ \  B" S% @" M. c0 O5 ^- y5 X
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号2 b, x& A, w* I6 z
  8.     SOCKET sockClient;
    8 T  W9 ~; ~8 I2 V# p: j1 \# S) }; Z( [
  9.     SOCKADDR_IN clientaddr;/ T" b' r" l6 G# h% Y. o& ~8 C
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" J2 M5 A0 h4 v/ k* L( j8 t. o0 {) h% }
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket, P. ^+ j, N9 h2 l$ N# E

  12. # O' a, c+ b# ]+ ^
  13. 6 g8 \/ J4 ?$ E  z9 E& y# W
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){/ _9 i% H. @% I6 [7 Y
  15.         printf("Socket has been created :%d", sockServer);
    8 ~& u8 m0 d# q% J. x! c
  16.     }7 O) K( l) J  z1 ]3 R
  17.     else{
    3 F% P. @1 \3 {) Z& r3 M
  18.         printf("Socket create failed.");
    + O4 A/ X6 F2 C$ F# {4 j
  19.         exit(0);
    3 c6 S2 V% C; F: M# a% e. A
  20.     }
    5 w* n7 p& H. G7 y2 W
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    1 Z9 `! v2 T1 R  _/ D9 f
  22.     serveraddr.sin_family = AF_INET;8 B* H% S9 _: t! D
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    9 ~" y6 Y* E& d! L0 }
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
      c: V. g, P$ i, W
  25.     char recvBuf[100];" T$ y. {- ?% @0 t/ ?" d3 i+ a
  26.     int len = sizeof(SOCKADDR);
    . r" L% E) q( A
  27.     listen(sockServer, 5);//5为等待连接数$ F3 }: v# A: H, k. @  @
  28.     while (1){
    4 N+ X+ w3 K4 O
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ U6 N- j. a# e4 j, _, F# q
  30.         //接收客户端数据
    . ~% h# m3 |4 f
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    $ ^! L" `4 Q- Q: r: ^6 k
  32.         printf("to me:%s\n",recvBuf);8 r3 b3 F" Z+ [
  33.         memset(recvBuf, 0, 100);
    8 y% V: @7 W3 G3 U  {/ \7 f
  34.     }( A5 j% h. a! m6 t# {) x
  35.     closesocket(sockClient);, i$ l3 C( n- J
  36.     system("pause");
    4 T/ ?6 J( w. x' g9 t, c/ I# J
  37.     return 0;
    . x4 R5 k6 N- e
  38. }
复制代码
客户端代码:- }3 o- W, U- J  ^
  1. #include<winsock2.h>
    ( q4 E, m- a# R9 m
  2. #include<stdio.h>
    6 [: `+ h" Q7 V1 v- b
  3. #pragma comment(lib, "ws2_32.lib")
    5 b: e. E! ]/ |2 Q0 }- Y5 C
  4. void main()1 a% O- [/ C+ V
  5. {
    5 K) b, H' p& `8 b
  6.     WSADATA wsaData;
    8 W% R0 c4 p; m2 Z) e" J  |# g/ x  x; l2 k
  7.     SOCKET sockClient;//客户端Socket0 y; f8 l- s% E$ s* W
  8.     SOCKADDR_IN addrServer;//服务端地址6 ?) I  k7 x, t$ h7 o! S0 q! t
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);( V! J" t' E! O% u+ B2 @6 Z& h
  10.     char message[20] = "HelloSocket!";
      K! G  s" `2 k/ P
  11.     //定义要连接的服务端地址
    + `# e+ M, U4 L0 N* l
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    , s9 a' N1 z; m( X. m# Z7 Y
  13.     addrServer.sin_family = AF_INET;
    9 {$ j3 r- z9 t& j5 ~
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    - v7 \/ H% {" o
  15.     //新建客户端socket
    # p* G3 p1 M& G5 A( R' W
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);: x2 N/ V6 Q* W/ _4 [
  17.     int s = 0;2 C' W4 [( ?/ v  i0 x1 b% K/ T
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    0 U8 W% m1 C' {! E. v0 h6 ?# n$ Y# e

  19. - |6 z) x0 {& a) _! D" V: a
  20.     while (1){8 q) o3 \0 k, {! t
  21.         //发送数据& a: i8 `- O- O
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    " C; n0 B  D9 |' N6 O4 v3 p2 }4 E4 `
  23.         printf("to server:");+ C1 D2 v+ H/ V6 O9 `( N
  24.         scanf("%s", message);
    9 P4 G, h/ {( [9 U. F* C+ B9 d. i" V9 M
  25. 7 \( F4 z, L. @
  26.     }
    4 L: ?% e4 p8 `
  27.     //关闭socket" O# ?0 t0 o3 O. W9 X/ D  I* e+ f3 ]
  28.     closesocket(sockClient);
    4 q6 r. l, `7 p
  29.     WSACleanup();( F7 d  {' x" f: m2 e5 R4 j
  30. }
复制代码
求懂的高手来解答一下。
0 M7 f, {7 Y' N) @: c谢谢了!/ ~8 H- t" [: K0 |: p# y

8 [+ p: J8 w/ ~, v$ x2 T  X/ S# ^5 Y2 u
9 x* z/ v4 r+ d' ^/ _& {  T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为: S) O, d' N; x% q8 y% O7 f. Z
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 01:15 , Processed in 0.110667 second(s), 18 queries .

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