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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。( q% k. |+ X* t3 F/ R! s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! q8 p$ ]9 A- u- LTalk is cheak , show me the code." S% q: d  E8 b- M" G9 t
服务端代码:
; P7 `$ n# ~& k, T" T, s
  1. #include<stdlib.h>
    6 M4 f& U$ w* L' s$ J' T* \
  2. #include<WinSock2.h>3 h7 h# g* \' F! u$ ^2 X
  3. #pragma comment(lib,"ws2_32.lib")
    + i; D, s: }% ^" W- H4 N+ r4 N
  4. int main(){
    3 e. k" h& z; @2 y0 J4 d
  5.     WSADATA wsd;* Q' y, O6 Q) R  D8 L
  6.     SOCKET sockServer;
    9 t8 \! G" O# f8 i& g; X
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号+ ]8 y) w! H7 ?  ~  w3 t
  8.     SOCKET sockClient;
    7 H8 ?! x* `" U* ]
  9.     SOCKADDR_IN clientaddr;
    6 W/ e3 ?( z, e$ Z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 C% Y: U6 m) I
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ' c5 i$ z. B( b/ x' R' ?

  12.   R& ^. A2 P6 I6 `0 v" _* p3 ]
  13. ! t# o* C5 ]' x. U6 C/ M
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){5 ^7 K  D+ C6 {% o9 _
  15.         printf("Socket has been created :%d", sockServer);. f) `7 R5 z; e7 I7 ?1 I
  16.     }( w2 U* s) W3 N+ W# }: e
  17.     else{" o; O% A- F2 x5 T( v6 }
  18.         printf("Socket create failed.");
    9 I% q7 h# r" _0 E: {- w( ]1 d1 o
  19.         exit(0);
    % {; \& c* |1 r& C, a: p& c
  20.     }$ |, U' A* N! t0 ~. ?
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. O* j3 @& Q* `( z" u- F& U
  22.     serveraddr.sin_family = AF_INET;2 n9 }6 k- W) {6 t
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000* Q. E( W% I1 D6 z' U
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # I, a  ^8 m$ n0 f& k1 ^8 ^5 W* h. r
  25.     char recvBuf[100];
    # C2 s- H% ^4 n5 R  ^$ E* o
  26.     int len = sizeof(SOCKADDR);
    % m- ^+ r0 {( \; v
  27.     listen(sockServer, 5);//5为等待连接数/ |1 P* u7 h' M  F* T0 ]
  28.     while (1){
    . ?- W: N% o5 g; o/ _* W
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);  g5 P: C! G  H& t! r
  30.         //接收客户端数据* [. V7 [! n0 o) r1 F
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);# c; R( v1 N' L( h: q( d4 I& s( d
  32.         printf("to me:%s\n",recvBuf);
    , h% O2 D# T% p8 ?. H
  33.         memset(recvBuf, 0, 100);4 Z2 I7 Y9 D( n  j9 t
  34.     }
    5 G$ D9 S: K. E* W- h
  35.     closesocket(sockClient);
    ( J( B. V9 y: H9 p4 k6 E
  36.     system("pause");2 j5 j2 u, W. Q+ m0 S! Y. \" q
  37.     return 0;
    % E: `2 [6 k0 f6 k
  38. }
复制代码
客户端代码:
3 }( Y' D# `3 S: H1 H' d3 y. v
  1. #include<winsock2.h>
    # _' B  A0 J6 J6 A  Y* V
  2. #include<stdio.h>
    ' a# k0 D% P, ?' T* c- V3 g
  3. #pragma comment(lib, "ws2_32.lib")9 r! P. }$ w2 z
  4. void main(); d$ W+ w2 i! N- r/ {0 a
  5. {$ m. T: e/ _! x* C7 ^) @( S2 g1 U
  6.     WSADATA wsaData;" V& g% y7 D9 t+ k
  7.     SOCKET sockClient;//客户端Socket( M& J! X3 W) Q/ `& W' r. d
  8.     SOCKADDR_IN addrServer;//服务端地址9 W) H3 t) m; m
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    0 G" T3 B2 C: b8 B2 i
  10.     char message[20] = "HelloSocket!";
    9 x: l4 P5 x% U/ I4 r% s
  11.     //定义要连接的服务端地址
    - h7 [* z+ m: @" o$ ~! U& u6 d
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    : o, [1 ^/ @6 e) y5 n
  13.     addrServer.sin_family = AF_INET;! P+ N. F6 g* s; a6 n, }
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    , Q8 v# O; n6 w6 V; m
  15.     //新建客户端socket
    1 b: c7 E3 o  E$ R2 @
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( g& m- J$ F) ?) {4 j: C0 C1 H
  17.     int s = 0;0 {  |' k6 m' A; ]$ i6 j# [
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));1 b5 e0 ?. ~* G
  19. 8 F! _: N6 E2 p
  20.     while (1){. W# C* I. V. ?" C$ y
  21.         //发送数据0 `7 \2 N1 N- c8 t& d- R
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    2 c! L, L2 w+ B
  23.         printf("to server:");: `: O+ x& w, L/ v& Z+ y
  24.         scanf("%s", message);
    : f4 G# O- I8 _9 p& n

  25. 4 c" I( K+ x) J
  26.     }
    4 M/ A" V7 j3 y
  27.     //关闭socket3 [: i+ X' y. |8 Y& ]% t
  28.     closesocket(sockClient);9 v/ s7 J. U# r9 w% R
  29.     WSACleanup();
    % B9 ?+ K+ Q8 u' m6 ?! w+ ^; G4 K
  30. }
复制代码
求懂的高手来解答一下。
/ g, o# m! |) e谢谢了!4 S+ ~* i! g; o! j8 l& V
3 \0 ^4 n: c: j$ r& N6 B& y$ f: G

' G* q, v& C+ g2 _+ E0 Q
7 D) _5 K' Q; |: ]/ 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); 这句改为
4 V+ |$ Y! b4 v. G4 srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 14:07 , Processed in 0.051575 second(s), 18 queries .

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