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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
4 U+ D- j* [( r  L% B我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
& ]4 q% O; y, r* T4 H; C& mTalk is cheak , show me the code.
8 U# d' w, y: m! r7 U服务端代码:
, z, F0 \. r3 f+ o9 E& v
  1. #include<stdlib.h>; p; E7 C7 x3 y* b% d- K
  2. #include<WinSock2.h>
    % t. \( h( d- B7 a! {
  3. #pragma comment(lib,"ws2_32.lib")8 f2 H# ?; ~: j& w4 H
  4. int main(){
    3 \  A( r6 V9 q( r# b" S
  5.     WSADATA wsd;5 ^1 D3 O0 r  p; G% m) |. l
  6.     SOCKET sockServer;/ V. G: ~: n& ?0 j
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ' N" o# I# d/ k, y2 I6 U! b
  8.     SOCKET sockClient;
    % p/ B) @& j' D; x6 R* O, \9 A% ]5 S9 Q
  9.     SOCKADDR_IN clientaddr;4 \! o, K: R' p" j
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口5 W2 O$ G2 `5 Z8 q# g9 o
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 Z2 V  M' O4 F5 k2 N

  12. : ?/ _9 Z/ z% ]8 p$ K

  13. 6 o, V2 ?( n0 \+ q; {( p
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){0 w. `* }2 ~' R$ G  a) G' K
  15.         printf("Socket has been created :%d", sockServer);
    % u$ ~4 U5 D/ O- Z/ b0 g, \, l
  16.     }1 I. r, p, d. ^  a: G+ e
  17.     else{
    6 F1 o7 [& C7 Q' z! S6 d2 ]' Z9 y
  18.         printf("Socket create failed.");- i5 W! @3 J4 a
  19.         exit(0);3 J! P0 K+ K: ]9 a8 x- E! t* Q, A
  20.     }' n9 {# D$ c- c" V) i
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    : P3 O( M" p" h* |4 \0 f; ^0 x
  22.     serveraddr.sin_family = AF_INET;
    . e2 ?) t( Y1 H" y+ s" H% k
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / {5 H7 h. c8 B% Q# W. s. T6 _0 H
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' V& N! S8 I. N/ c, {. p- T$ M
  25.     char recvBuf[100];) N2 P5 U, Z! }, ?/ e3 J" K. J# e; w
  26.     int len = sizeof(SOCKADDR);
    2 G# E, }: ?" S! S5 C
  27.     listen(sockServer, 5);//5为等待连接数( q% o+ H6 Q) H
  28.     while (1){# k  o! e- P" v; d- D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " \; e9 \) T% j+ @; i
  30.         //接收客户端数据
    4 M- l9 {  z3 M# e8 A: K, j
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);& X8 z/ @1 I0 J$ B
  32.         printf("to me:%s\n",recvBuf);* G% m5 e) Y4 M0 ?0 E
  33.         memset(recvBuf, 0, 100);
    ; U; ]: M4 f6 `
  34.     }7 n* N7 I- }, q6 O  U. x8 n+ s
  35.     closesocket(sockClient);" ]# {) U8 P, m4 C9 g* s) u+ e, R
  36.     system("pause");
    7 u. g) j' V$ C" O# d6 L; g
  37.     return 0;5 u0 T, Z2 J8 Y% w
  38. }
复制代码
客户端代码:* }; ~3 }, a* M/ j. ?' s% v
  1. #include<winsock2.h>& _7 U  J; D% Z& c4 q, g
  2. #include<stdio.h>0 r  E% Z% ]4 t* n6 _. i2 C
  3. #pragma comment(lib, "ws2_32.lib")
    ( n) p4 I! c9 R) T  X/ f+ b
  4. void main()" F$ k  u8 f6 ^% \3 i# ?) l/ D
  5. {1 Y7 \& ?! o$ J) {- p7 g& e* n
  6.     WSADATA wsaData;
    " P- m' C6 z! w1 h! T' @) K
  7.     SOCKET sockClient;//客户端Socket
    % f  B: A5 i3 K0 ~% p& M: i) a
  8.     SOCKADDR_IN addrServer;//服务端地址
    8 n4 }& ?- q7 H
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);5 K6 v9 F5 ]  A* p, Q
  10.     char message[20] = "HelloSocket!";/ `2 W% z) r$ I4 u+ u+ K. u
  11.     //定义要连接的服务端地址4 Q, {% n* `4 J! a3 G$ d
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    , |2 u* j' e1 d5 F% l; T8 L9 }
  13.     addrServer.sin_family = AF_INET;/ h7 ~! g& p/ N/ ~& Q2 S+ D0 x
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    7 d2 X/ i- v* N5 p3 H
  15.     //新建客户端socket
    6 b: i, t5 W/ r. _# p
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    8 j3 e- E4 i& {  D4 [  u
  17.     int s = 0;
    # z" O, F8 o' H- D
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, A) d; N% e' y% O5 T2 A% t3 Y4 `, D

  19. 5 {6 R) Z% L. m  z) Q3 y* C5 E
  20.     while (1){
    * Q+ h! V7 p4 w  s" c
  21.         //发送数据( t9 S! E, T( N6 ]% U  R  k' j
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ! n3 n1 E* g: `7 i
  23.         printf("to server:");2 e. B1 j& a' M* R
  24.         scanf("%s", message);( Q0 `% i5 u( g: |# Q
  25.   S; `3 B$ v5 m$ C9 M! k; @$ A0 M  Z
  26.     }
    - {5 E/ O/ E, X6 z# S
  27.     //关闭socket
    7 H8 x7 V6 P! _- o  t& k
  28.     closesocket(sockClient);
    , @$ Q- S, r# c/ t/ @* O/ Z4 W; L
  29.     WSACleanup();% O  h: O! f$ u% ~  V: T6 r
  30. }
复制代码
求懂的高手来解答一下。
6 S; ]7 L+ A4 v: K! {: ?谢谢了!- @8 y/ L. u$ d+ A$ O& L' G

9 S3 C$ V) x9 @' n! W
1 T$ e* u# U. T, q' y# I" W0 q& z! m6 m0 i6 N& H* `) E' J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2024-6-29 20:27 , Processed in 0.122784 second(s), 21 queries .

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