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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
3 e7 a/ k& g$ h0 P7 A我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
  c- v% B4 m1 S1 KTalk is cheak , show me the code.
: m2 n3 c& e2 x9 _* V! k' }+ d服务端代码:$ H3 @7 w% A2 T0 L8 W
  1. #include<stdlib.h>5 Y8 k" \6 D4 X) Y5 B& ]
  2. #include<WinSock2.h># W: }! X9 |* Z& G
  3. #pragma comment(lib,"ws2_32.lib")
    " L9 R1 b( e  m* A2 Y9 m
  4. int main(){6 z$ G: a: K- H, C5 ^
  5.     WSADATA wsd;7 g  _, w; n+ g7 I$ l8 l; g
  6.     SOCKET sockServer;- t8 l& E. G& ]1 ]. R! Y$ W! B
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号6 Q) |: N5 }0 Z0 e) b
  8.     SOCKET sockClient;
    $ P! @7 T: c: V
  9.     SOCKADDR_IN clientaddr;5 f: P. J7 i$ v- V, H
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口+ Y8 P0 b9 L9 C! B' o* }" _* t9 z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket) N1 z* c  a) i" r* ]
  12. ) \" L# _2 e0 c  @6 I/ E
  13. ) U, q( l) b" r" [1 L
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    5 M9 h; `2 f# k0 \( c
  15.         printf("Socket has been created :%d", sockServer);
    - [5 G& c0 H/ S5 P  ]/ ^; J' ?9 @
  16.     }, f  J/ X  Z3 Y3 }; S, O
  17.     else{
    / {7 @2 K! V. v* V/ a4 I9 V; j
  18.         printf("Socket create failed.");, p  b5 Y# k$ Y5 {
  19.         exit(0);
    + p' m: ]% c! }
  20.     }6 T1 Q3 L% T; `( ?9 ]
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);4 V( a$ M9 ^0 |, L
  22.     serveraddr.sin_family = AF_INET;
    3 z+ i2 T- W1 d: l
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / s  h& f& T+ Q  n: }2 _
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& U$ U! x5 [& [
  25.     char recvBuf[100];
    , I- ]7 u  A: Z0 F) D
  26.     int len = sizeof(SOCKADDR);
    , R1 u6 e! K' n/ K3 P
  27.     listen(sockServer, 5);//5为等待连接数
    + Y1 u3 T( Z3 j5 i
  28.     while (1){
    , u/ R0 z. e3 g, Z8 M! T- b4 L
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " ?/ W7 O  L9 Z+ z* n9 m. \. c
  30.         //接收客户端数据
    7 C; V7 N. w# @6 F" i8 u
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    3 I, o3 R" t' }; o4 F
  32.         printf("to me:%s\n",recvBuf);; f0 d  `9 W2 ]/ X0 P3 [
  33.         memset(recvBuf, 0, 100);
      Q* E0 Z2 h3 F- q5 v
  34.     }! \8 t; g+ D8 I
  35.     closesocket(sockClient);1 y' ]4 v1 \2 F- ]4 J# D* [7 Y5 h0 T* j% C
  36.     system("pause");3 |0 ?! V* q' G. M9 A4 F6 g
  37.     return 0;
    - w  d# M/ V! \7 E2 C' Y1 W% A$ e
  38. }
复制代码
客户端代码:
4 V1 T' d; ^. i" b7 ?8 C$ m
  1. #include<winsock2.h>3 s1 k$ |1 U, O3 g! R7 P# q! o# o
  2. #include<stdio.h>
    + r. {3 s2 c; p- _" I
  3. #pragma comment(lib, "ws2_32.lib")
    7 n( M+ W4 o& l( X3 Q0 r
  4. void main()3 d! Y) Z; y+ M/ b5 F2 R/ i
  5. {
    1 A0 @. g- ^- r2 A0 K( {0 I
  6.     WSADATA wsaData;
    4 O' c* ]+ K) s/ c4 j* V2 R$ `8 d
  7.     SOCKET sockClient;//客户端Socket: g4 b, Z' K3 h: _
  8.     SOCKADDR_IN addrServer;//服务端地址
    - R7 O) @1 y. S' k/ n; `
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    # A0 i( v9 R" A3 a+ I9 w
  10.     char message[20] = "HelloSocket!";
    % i, y7 [  q& w. b% C0 f7 |
  11.     //定义要连接的服务端地址" }3 ^+ u" B( b2 f+ @3 N2 R
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)$ v4 c3 G1 S/ G4 l4 f
  13.     addrServer.sin_family = AF_INET;8 \3 z* o2 A, P% I. `7 ^. U) K
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    + k( P6 r% ]4 m, c& }$ l9 j
  15.     //新建客户端socket
    4 s7 l/ F! \) k1 ^
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);, V6 g5 |, r/ j! o' x
  17.     int s = 0;
    7 |$ M: D, v4 d  C' I: U+ D1 M
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    7 A/ G8 E) a! R3 O
  19. ; ^+ u' O* y, U3 \$ ]4 D8 t5 B; U
  20.     while (1){1 t0 s& c. e: M6 D$ Q7 Q7 v+ h, }
  21.         //发送数据+ `5 s6 T8 [: `' F
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. Q( q, B7 y5 e1 {, S9 N9 G
  23.         printf("to server:");5 F: `; }" |# z7 F: u5 ]1 f
  24.         scanf("%s", message);2 I( D+ b4 b+ h& e  F
  25. ) |1 {$ N  ~& S2 V8 s; z
  26.     }2 Z* b: A( S, P0 l5 K
  27.     //关闭socket: d6 {6 w7 l" W0 P* `$ E
  28.     closesocket(sockClient);
    , j9 _' ?/ |$ Y# T2 C; o( z$ Q
  29.     WSACleanup();4 l; w3 B- X3 P: j
  30. }
复制代码
求懂的高手来解答一下。
# Z" p# w' b9 |1 {谢谢了!
3 X6 m' C" |$ X6 P3 p: X
. V- @: f: ^( K  J, V

4 g, G: x% {2 y3 |8 q$ T$ q# e5 Z5 j* b5 X. O# s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为2 O/ i1 _8 K+ l6 _) ?0 J2 @( |
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 12:23 , Processed in 0.111612 second(s), 18 queries .

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