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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。6 m5 o0 y5 ], ^8 m
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 S, _$ ?; \7 g1 iTalk is cheak , show me the code.0 ?& T. S- X3 {* m' k
服务端代码:8 J! m" `; y5 n) K# N9 I( b
  1. #include<stdlib.h>, B% s) j1 |9 G# o$ K" @- k; x
  2. #include<WinSock2.h>
    8 u' f! N) Q! w* M) t( i
  3. #pragma comment(lib,"ws2_32.lib")8 Y+ i7 v, _: R' D) u4 a' K
  4. int main(){
    1 T- \6 i6 F1 J3 K) I* U
  5.     WSADATA wsd;4 v! R, t$ a7 M1 x1 H! @
  6.     SOCKET sockServer;0 f1 w9 a& K7 A. e' |5 u- o* O5 J
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    * ]2 [$ m( d6 j/ C
  8.     SOCKET sockClient;
    / [) Y+ A* q0 B5 @8 V
  9.     SOCKADDR_IN clientaddr;1 t7 [# \" |4 G( T) t+ b1 s
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    * \! J2 J& \, S" N! |% J7 O) y4 ^# [
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: M9 d* w1 k' l6 B% V
  12. " L# U) m( @- w/ |$ \" B/ H' d; G

  13. 9 h, ?$ Y6 A* u+ c
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    & S1 Q+ o& q; q! c
  15.         printf("Socket has been created :%d", sockServer);
    ( W2 @, n2 ]+ D5 ~
  16.     }( P  z7 }- h& {5 m
  17.     else{! e- A+ u2 ?9 R$ e5 L; q
  18.         printf("Socket create failed.");
    9 ~1 I# F7 P$ K2 ?
  19.         exit(0);+ e. g7 s7 A8 I: C# C  r6 D" s
  20.     }2 [3 m4 y2 i( l# n" m
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);2 U' r: T& b; M( {
  22.     serveraddr.sin_family = AF_INET;/ N3 {- l+ L) a: I8 B
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000; B5 t" f/ @' J7 u% p
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));; W0 ^" L! K. P7 o  m
  25.     char recvBuf[100];
    + R# H9 V8 K( {  ?
  26.     int len = sizeof(SOCKADDR);( e& e( |- a& b& `3 |) S8 S
  27.     listen(sockServer, 5);//5为等待连接数
    4 f1 `: a/ [' c5 q( q
  28.     while (1){
    - u! \% G- X% m" L+ N
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);3 t+ s: q9 R/ H9 b- s
  30.         //接收客户端数据/ y3 F7 a* P* U' s$ e! G. ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- b  O1 f+ v6 e7 c+ f
  32.         printf("to me:%s\n",recvBuf);- U" b  o2 D1 ?  R; J
  33.         memset(recvBuf, 0, 100);1 W% S; J. L, B
  34.     }/ j' [3 _! t$ P5 ?/ x' d' ^
  35.     closesocket(sockClient);
    % k, o8 s: V/ t9 a* ?; u; C) _
  36.     system("pause");
    6 U" M, G6 M3 C0 Q+ ^6 p# `' `
  37.     return 0;
    ' R" o  T% L! i
  38. }
复制代码
客户端代码:$ K7 ?+ `: x' ~
  1. #include<winsock2.h>/ a& _+ O( N8 o6 t, C* G$ Q9 |( b
  2. #include<stdio.h>
    5 m7 Z& y& x7 ]; i1 F2 k; T
  3. #pragma comment(lib, "ws2_32.lib")) j5 y0 g- B. t* o
  4. void main()1 T2 J1 u. D, `8 g; X
  5. {
    % n& X/ h8 C! l+ b+ Y+ n# R$ c
  6.     WSADATA wsaData;
    4 M% X( z  k& `
  7.     SOCKET sockClient;//客户端Socket
    0 O( K$ J2 d; D) V
  8.     SOCKADDR_IN addrServer;//服务端地址- j1 {! ?6 ?9 a( Y  U( I" d
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) W! j! N: a* F" ^
  10.     char message[20] = "HelloSocket!";
    ) A: n; G) t! z0 a7 v! c# q
  11.     //定义要连接的服务端地址
    # [) }6 f4 F, k
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ) p% a! G; w2 q2 m7 P
  13.     addrServer.sin_family = AF_INET;
    / A# c0 u6 c5 ^! p( j8 [  i5 C
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % O( m- z. p4 H) D1 I1 q  u
  15.     //新建客户端socket  w, n: j$ X% j5 O5 s  [& Z' w8 C
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);4 X( }' g6 h( I. @( {" S, N5 S
  17.     int s = 0;
    & w# @, o7 L% v4 `
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    . p  A. @+ B& r8 s1 a' o  d
  19. 8 W# m: f" w+ p! |* k& \. {4 ~
  20.     while (1){
    9 ]2 n' B' |, a7 M1 I
  21.         //发送数据* Y: \8 ^! j2 E/ j4 Q! ~
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);: m  ~6 f' }' [9 d' f4 T
  23.         printf("to server:");( ]0 Y9 M6 y- D6 M9 f
  24.         scanf("%s", message);
    , ]' a7 o! X; ~+ b

  25. 0 H, l* ^& ^; f) `3 A
  26.     }" R6 Y) `# G: r' {
  27.     //关闭socket
    5 K& H( M* C3 G' f
  28.     closesocket(sockClient);
    3 I3 K) p1 b" p
  29.     WSACleanup();# O7 E3 x: u9 C' T/ U
  30. }
复制代码
求懂的高手来解答一下。- a+ r0 Q/ D1 q) U. o% @) Q
谢谢了!( w# E; ~+ |" d4 J, {& b
' w; K8 F; Z' t/ v, {8 ?" E
. g: t5 _. T* s  _3 X9 L6 a. n

  ^+ S4 n& g9 l) _3 H0 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); 这句改为
) p% ]$ K+ Y! H5 _/ Krecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 10:58 , Processed in 0.119908 second(s), 18 queries .

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