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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。
+ w+ i' q3 Q5 o我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 ^6 E6 e" `, W; [5 q) P, n$ `Talk is cheak , show me the code.# D: ~( i: P. i* F5 i) L
服务端代码:
, |: b: E+ Y" y! E6 k1 I' M' r
  1. #include<stdlib.h>
    3 M" B- u$ o: e4 `
  2. #include<WinSock2.h>
    * i. J4 B0 J$ |  v; ^' n2 t: L2 N$ r
  3. #pragma comment(lib,"ws2_32.lib")# r5 {- \1 S& g2 c, l
  4. int main(){
    2 H4 {! S4 y& P* J1 C! k( g
  5.     WSADATA wsd;5 q1 o7 p* Q7 ^! o( U
  6.     SOCKET sockServer;
    : ~: H% m7 Z1 Z1 t2 I8 V
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号" ~# R) {% c: z
  8.     SOCKET sockClient;
    * s. j$ p: i1 {& V
  9.     SOCKADDR_IN clientaddr;) q5 O5 @* D9 x
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口+ g! ~4 I' v; ?& W
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 \9 V; h" m1 F2 |0 I$ P( D: \
  12. $ d. u8 V  a/ {4 H, ]6 [
  13. 8 S% ?# c# a; t8 Q3 K0 r# D9 p
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){  a$ e( M2 ?7 M- f. {9 C. B
  15.         printf("Socket has been created :%d", sockServer);
    - j# w" |8 G. X8 ]
  16.     }
    + l% G$ Z& I6 g# d3 N6 p
  17.     else{+ @8 w+ d5 M' Y
  18.         printf("Socket create failed.");. s: c) M) {" l3 x
  19.         exit(0);
    4 f0 n% A1 B6 U
  20.     }  d3 I. ^3 z4 z$ `1 g$ i
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    % D' q; q+ O) k. a5 i- i
  22.     serveraddr.sin_family = AF_INET;$ T, p' T' I. D  R; U
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    + C/ x2 M$ H5 x9 l. ^3 p: q, C
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));; s5 ~6 _7 |& N, w$ F
  25.     char recvBuf[100];- x, F+ D) u3 a( Q; D
  26.     int len = sizeof(SOCKADDR);  O; P, ^+ F$ X8 I* y4 b
  27.     listen(sockServer, 5);//5为等待连接数
    ; v' e5 Z  ^* l9 T
  28.     while (1){# R4 K6 ?0 O% Y) w' q; t
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);# }6 E  @& V3 \( c* f
  30.         //接收客户端数据4 Q  P7 v: h8 j. i
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);+ O, @. J! S/ _; d1 z
  32.         printf("to me:%s\n",recvBuf);9 @& e4 b5 J% |
  33.         memset(recvBuf, 0, 100);
    + I/ J0 H; P3 n: B* \
  34.     }
    5 ~) `2 m) |7 z1 k" D) u' f. M6 ^( T. X
  35.     closesocket(sockClient);
    5 u$ R( ~! Z' |3 u
  36.     system("pause");+ I8 N/ L2 y( A) s. T( K
  37.     return 0;
    ' d2 A# k; Y4 X
  38. }
复制代码
客户端代码:
% c* A+ |- K' u" y
  1. #include<winsock2.h>
    ( S5 _# g/ q8 Z* F
  2. #include<stdio.h>) a( p% g* \5 w1 }. u6 A( ~0 G
  3. #pragma comment(lib, "ws2_32.lib")
    ' o  [2 A) m9 J8 ^, v% f# W
  4. void main()3 r7 p- X& p/ \
  5. {* B, t) p9 O; E5 _
  6.     WSADATA wsaData;
    ) c  p6 r4 I! k8 O  i( k$ ^
  7.     SOCKET sockClient;//客户端Socket
      G8 D0 s1 d; C6 a; c* A. V& f1 p
  8.     SOCKADDR_IN addrServer;//服务端地址6 c% V( c! U4 ~
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    5 d: U, r. V' a* c/ H' @* x
  10.     char message[20] = "HelloSocket!";' c8 m9 s7 c+ Q: _  v( L2 J1 Q
  11.     //定义要连接的服务端地址
    / [9 o/ w" G& p- w! D
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    , p2 _# L& p0 U0 Z% D5 P
  13.     addrServer.sin_family = AF_INET;
    0 U! g9 Y6 n: {! f$ E8 Y: W, s! V/ H; N# H
  14.     addrServer.sin_port = htons(6000);//连接端口60008 t9 S) H" u- H+ e8 G  ^
  15.     //新建客户端socket
    7 C1 }6 C6 V1 i
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    " L- o( k# a) s& `- K* T7 L( l7 ?
  17.     int s = 0;0 ^2 n# ?$ k5 K$ ?
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));4 p$ B3 @1 u2 M0 e  D
  19. ) w* r: d) Z6 p+ [% d8 u: w+ x
  20.     while (1){3 Z  f4 e4 x  C& w! [
  21.         //发送数据
    3 s0 a4 h* C6 Q3 k# E
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);3 J0 k8 }8 v9 z0 V
  23.         printf("to server:");
    . ^0 i' M0 O6 G
  24.         scanf("%s", message);
    " J5 x, u; T9 H
  25. ( m' C. S1 [' q! j
  26.     }' J" W1 Q% [: V1 s+ b
  27.     //关闭socket
    4 c; T. E1 T% R: |$ C3 H. b: M
  28.     closesocket(sockClient);8 Z/ C$ r1 J; e
  29.     WSACleanup();
    " ^  [* R: x4 p! j1 T# w
  30. }
复制代码
求懂的高手来解答一下。$ B' }; F, w1 w( M3 }1 d
谢谢了!
& U4 h4 [7 N& O7 u* c6 \! i
; m! C2 M6 c& [

6 L1 K$ R+ |6 S% R
2 U* w5 q3 C7 i+ d7 ?3 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
" L3 E* S1 C) G( x3 N  y7 W% U& l1 krecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-16 17:12 , Processed in 0.060722 second(s), 21 queries .

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