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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。! h0 r0 E- ~2 z8 A+ d' @
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
2 c0 T0 k& p1 W: R' _2 \# j- @) vTalk is cheak , show me the code.
, E7 ^% Q' a( c7 f5 S) R, N: ~服务端代码:
! O+ p' w3 B  Y& O. {9 \
  1. #include<stdlib.h>- J7 V1 N( W8 M7 i4 p0 |
  2. #include<WinSock2.h>
    - e4 g0 w, C- Z
  3. #pragma comment(lib,"ws2_32.lib")
    ! Q& N$ t" c+ W& w/ q
  4. int main(){
    1 C) p* [1 B5 c5 r; f1 z
  5.     WSADATA wsd;
    # D6 y* G; P0 m7 i6 d1 r
  6.     SOCKET sockServer;' P7 J6 C  V! \
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号, C3 C' |$ x' J, A6 n) H; J$ M' k6 [
  8.     SOCKET sockClient;
    ' \% P: `7 ~9 {9 D3 S! B: |  L% E
  9.     SOCKADDR_IN clientaddr;
    9 S! ], T5 Y0 o! Y( p3 T
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" `7 q6 ^# S# f5 l4 J5 }
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    , S1 O2 _& E; n" ~. ~* ^( s3 z* X/ z
  12. ! P- H8 f: Q- ~% i) s% l, Y" k
  13. + ^7 |$ x- `- u: S) @
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){: [: N) W. K1 t; k
  15.         printf("Socket has been created :%d", sockServer);
    , d. }6 K5 ^! _+ q! ]* v5 s7 \
  16.     }
    " l. B4 ]3 u) o# `6 D
  17.     else{( B; z" L. Z! a
  18.         printf("Socket create failed.");1 |  z- ^* `9 D/ k1 k9 u4 M7 J
  19.         exit(0);$ i1 {. Z. |$ U9 ^3 u
  20.     }
    - @3 e1 V  B3 U8 W/ _9 q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);- ?7 [; k7 w; L  x3 o, h
  22.     serveraddr.sin_family = AF_INET;
    3 W/ J, a: {. b. [$ b5 E- R
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000# m* R  h% @' n* |$ f8 P) c6 S- c
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ( n$ W% o& ^  k* m1 d
  25.     char recvBuf[100];! v+ v0 A% @. N! {
  26.     int len = sizeof(SOCKADDR);- h; Y5 v6 R* ]* y1 [
  27.     listen(sockServer, 5);//5为等待连接数
    * @5 b9 s# F, P; |+ R4 |
  28.     while (1){6 O# ^! w6 \( a  i: f$ l
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    9 r1 Z0 h  ^: |1 |. R
  30.         //接收客户端数据
    + t' }+ B2 x$ x% }
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);( Y! c) |# S$ A  `
  32.         printf("to me:%s\n",recvBuf);
    9 Z$ I; ^. T, P6 _' T
  33.         memset(recvBuf, 0, 100);
    4 ^4 X! X6 o7 \0 `% `& k& \
  34.     }; z, D% A8 M- H" r
  35.     closesocket(sockClient);8 p" ?5 S# f* m8 a! M9 Z
  36.     system("pause");
    7 I2 N3 }8 i) V, o! X  \
  37.     return 0;+ @: N1 A% N, L5 K( t
  38. }
复制代码
客户端代码:
# s0 G/ J0 x) A% j; F. ]
  1. #include<winsock2.h>
    2 f$ ?- k2 r. M$ v6 ?2 X, u8 s1 N
  2. #include<stdio.h>
    * g7 q" N/ F( e( h0 l
  3. #pragma comment(lib, "ws2_32.lib")/ s& ?" g, z9 u) q& g- U( e6 Y
  4. void main()6 v, A/ }* J" y0 Z7 E2 {8 E
  5. {1 ]6 g$ C: [/ \
  6.     WSADATA wsaData;
    2 _. S6 V' z0 h3 d' I. i) K+ e
  7.     SOCKET sockClient;//客户端Socket* S. G- O0 M+ y9 p% C" z6 i) I
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ y* l# `. X& T( y. g
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);! K) ^; I" A% ?2 a8 X* t
  10.     char message[20] = "HelloSocket!";
      O3 }9 W* k& i* k' o( [9 G
  11.     //定义要连接的服务端地址! K" i0 F) K+ c; C, [+ }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    8 X6 H* |* M6 c; L
  13.     addrServer.sin_family = AF_INET;
    + ]$ O4 @! B- `4 Z3 L
  14.     addrServer.sin_port = htons(6000);//连接端口6000" d2 E/ P* c* s; ^% q8 z. ~
  15.     //新建客户端socket- s6 e4 @' R- C0 k0 P; D. X$ t+ p
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);6 h& c5 Y, R; I+ D: _7 J' u
  17.     int s = 0;$ b, U" O: |9 L! I6 n6 s
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    - W9 @* e8 o" k/ t
  19. % b' ]$ A# V3 @1 m" ?! x
  20.     while (1){
    , O+ J' \/ F$ Z
  21.         //发送数据% P4 D* Z7 @1 J& `
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ! s2 {2 q& t" l0 d: }
  23.         printf("to server:");! l3 i% g2 X2 d7 B5 `
  24.         scanf("%s", message);6 e" C/ ]2 a' C. U& @; U0 y

  25. " V6 G2 Z; j9 |  v# n% A, Y
  26.     }4 b7 A. X( l$ O# F( g% U
  27.     //关闭socket; V& C3 a' ?" L
  28.     closesocket(sockClient);4 P7 E3 ~9 I# C
  29.     WSACleanup();' F" o  G: c5 U( v, q2 C
  30. }
复制代码
求懂的高手来解答一下。
0 T9 n7 @8 J' G+ o谢谢了!
2 t: }- ?9 Y  q6 b  o
. S$ {8 d- f' c$ ~# V% z9 ]

& F' C: b! f( A& [1 }4 [/ ~6 c, W
( n8 F, ]* I& g3 U0 t" Q3 [7 B" }# O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
  C( F4 F" S- e* {- ^: |' Lrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-17 20:01 , Processed in 0.058512 second(s), 18 queries .

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