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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。: \( b2 ]- R! z. J& t
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 ~4 h8 B$ L; YTalk is cheak , show me the code.
6 F. @* u7 s. `  W& f* Y服务端代码:3 d& s& P3 J: d) _
  1. #include<stdlib.h>0 s1 @0 d+ [. L) u1 o
  2. #include<WinSock2.h>
    ! a+ C' @4 q, ~* ^! ^0 w/ M/ B
  3. #pragma comment(lib,"ws2_32.lib")
    , W5 q/ A+ ^8 G' O1 j: W" O/ R
  4. int main(){* Y# G1 [8 _% ]. J
  5.     WSADATA wsd;
    7 G+ p2 X  X+ k) C+ F5 l& Z# G
  6.     SOCKET sockServer;
    + J: v( N, N. q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    + B/ X+ X( ^! ^* |6 g
  8.     SOCKET sockClient;
    ( G/ O& {) b& B! c
  9.     SOCKADDR_IN clientaddr;
    9 F) p" h0 C+ C& U; a6 L
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ) e% Q3 v& E$ g, c! e4 ]
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    " e" O1 Y# p6 T3 ^5 @

  12. 7 \' s! ^: _9 W) H/ K" u2 Y7 a
  13. 5 z+ E/ l, Y7 N" B( V! l
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){, F7 Z* s+ `3 U- w/ _$ c$ W. N
  15.         printf("Socket has been created :%d", sockServer);
    1 Q* T2 v* ^. T" Y, O$ H
  16.     }
    6 j/ X$ b5 Y2 v5 j: `: W1 P: _! l* X
  17.     else{$ K+ f6 K- l' C/ V% a0 g
  18.         printf("Socket create failed.");! ^) z9 @. F; z# [* X# _
  19.         exit(0);+ l' o, i" ~. N6 ]/ ~' E) t
  20.     }
    9 P. W0 C+ M! C3 i
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    0 P7 ?. D- y5 U3 p
  22.     serveraddr.sin_family = AF_INET;4 Y) C7 F* Y0 [! b
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000+ A& c: r9 r* [+ |
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 r% w6 f. W0 O: a8 o2 V
  25.     char recvBuf[100];3 S/ R4 N7 n8 u0 Q8 g
  26.     int len = sizeof(SOCKADDR);
    & H1 U; a8 n. r" w
  27.     listen(sockServer, 5);//5为等待连接数1 j! y# W+ t( j1 {+ I0 p, \* J0 Q
  28.     while (1){6 O- X) z& w$ ]3 Q5 G' r
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);! o" ~/ p+ F+ c
  30.         //接收客户端数据2 `3 s- I. U. v
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);' v1 z6 T5 m! L
  32.         printf("to me:%s\n",recvBuf);/ E# B/ _; m% m" `+ w6 i3 [: N- a0 e
  33.         memset(recvBuf, 0, 100);, \. q  O; c- \7 o: b. v$ Z4 J  M
  34.     }
    - ?! z8 A1 X4 J8 _# @+ P+ f
  35.     closesocket(sockClient);8 u1 l+ y8 T3 y. R4 I8 p
  36.     system("pause");
    & I8 X. C+ m5 z( K8 J) j
  37.     return 0;8 I* v8 c0 O; F6 S
  38. }
复制代码
客户端代码:
% {7 m) v- P4 s0 `: N. E' v1 s+ h
  1. #include<winsock2.h>. a+ L5 {; V* E3 H! x7 o- ]
  2. #include<stdio.h>
    # x- u$ W4 K7 x) G" v' \  \# C- B
  3. #pragma comment(lib, "ws2_32.lib")  X  B( M4 O! ~( }9 @+ G8 H
  4. void main(): v8 l, V" V5 q. G" q
  5. {
    ! d* G! j/ L4 ]. l
  6.     WSADATA wsaData;
    . f+ C8 f% e$ ^: l
  7.     SOCKET sockClient;//客户端Socket" t  E9 g0 M+ |' y% I
  8.     SOCKADDR_IN addrServer;//服务端地址
    & b& K5 V, T: ^' w3 O
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);0 X7 p: C/ R7 X1 X: R
  10.     char message[20] = "HelloSocket!";
    3 R0 P" |" r* w% \1 \$ Z$ H
  11.     //定义要连接的服务端地址
    4 [% w3 y* a* `, Z+ T9 v
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ' A+ N# |7 S+ F; ]) M% E# q
  13.     addrServer.sin_family = AF_INET;" V3 F5 N9 G) _- a0 g- [
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ) C/ e, j5 W: ^
  15.     //新建客户端socket
    2 b1 U% d% E! f6 G  X4 W. j7 M, f
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);& V1 j: `/ ^  E! R2 s
  17.     int s = 0;
    9 `: ~* m+ q# B
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));5 J) [# e) c: {, q

  19. * }2 K( C6 S9 _3 q1 u& @; W2 j
  20.     while (1){
    " b  Y& l! P% p4 o1 L5 G& F! ~
  21.         //发送数据
    $ o& n6 I9 L$ ]2 W0 A
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);/ X/ P8 e- U( T; A8 e6 m) [& R
  23.         printf("to server:");
    9 a! p/ D" `, i$ Z" h
  24.         scanf("%s", message);$ P  r8 O  u* \' O0 b( @

  25. , a+ j* E3 k1 J0 ^% d7 L
  26.     }6 P4 F8 `3 Y/ s* p. U. H
  27.     //关闭socket! k# p7 K; n4 ?8 `6 Q
  28.     closesocket(sockClient);
    ; r% z$ H: c' A; \
  29.     WSACleanup();& _% i6 S4 `7 }6 e% P
  30. }
复制代码
求懂的高手来解答一下。
- J# z8 J* M! N2 Z: g* T谢谢了!
6 z6 O5 o) V9 v" ^1 R4 e0 f8 m( _% \
1 v8 t+ X# g. z  p- y! x. r/ q
2 ^! w9 o* T9 V9 ^% \
, M$ D+ H+ _6 r( ]
分享到:  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: a* H) {: [7 G2 p7 X# krecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-16 16:51 , Processed in 0.051911 second(s), 18 queries .

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