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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。" Z" L( V. c" D5 T" l* \9 N9 ^
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; D% A2 G; }% }$ {+ X$ H/ ATalk is cheak , show me the code.
6 y) Z! g! z. d7 g/ B服务端代码:
7 V; H) h# r& a& d- F. V( n9 j& T
  1. #include<stdlib.h>
    , N3 h! y6 l2 V7 T
  2. #include<WinSock2.h>
    * G- }* K/ a4 d0 H( n* p: \
  3. #pragma comment(lib,"ws2_32.lib")& e0 b+ T8 d6 X4 p# z% W
  4. int main(){
    9 f: m8 l6 {) s+ H) M
  5.     WSADATA wsd;1 y) C% m  v! M) t9 W+ M8 V
  6.     SOCKET sockServer;$ `$ D' T  k2 q+ t, Z# r
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ! }$ C0 u6 W: a) ~+ c3 |
  8.     SOCKET sockClient;
    , j6 ]: \6 J7 D/ v+ o
  9.     SOCKADDR_IN clientaddr;
    $ m0 {) v3 G( v. n6 S( A
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 v0 e: o6 r" b. [4 x
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    " O6 b5 y/ o# C

  12. 6 V1 a- Z$ S* W, F5 V8 P: o0 @
  13. 6 F1 G, C5 F0 Q* ]! v/ I& `1 r
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; m, k# K# S6 U! k% l" X
  15.         printf("Socket has been created :%d", sockServer);
    5 w  O3 s5 P/ P5 S% h
  16.     }
    * z  v5 H" J$ k, |
  17.     else{
    . Y' w$ |% C4 V5 z& R: E6 m
  18.         printf("Socket create failed.");( i$ p) c0 k0 }  o' ]+ p  `
  19.         exit(0);/ q/ }  k) g3 `/ E$ S" c, I
  20.     }" o6 f" a  w6 l' l, w! m/ Z6 [" r( V
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 ]/ N) T$ j9 w- K$ q
  22.     serveraddr.sin_family = AF_INET;
    3 ]( X  c: u+ a5 y1 u* j. |6 p
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000: ?1 _7 m) T8 \7 \% v4 N2 G
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    8 w! _$ t+ J" U$ X
  25.     char recvBuf[100];% D0 Q* P* B  ?! q$ W  e! H( |
  26.     int len = sizeof(SOCKADDR);
    & H5 A" w. c; ~
  27.     listen(sockServer, 5);//5为等待连接数
      o$ Y! ?, m& n1 D, g6 B2 {! Y( _
  28.     while (1){
    8 P; N2 b% u8 u
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);8 v, {) A7 [" W& O- i; j" B6 g
  30.         //接收客户端数据
    / V( k+ e/ [$ O
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    8 I0 q" H. R  {( W
  32.         printf("to me:%s\n",recvBuf);
    6 D' p0 ~0 Y, J0 S& }% Q
  33.         memset(recvBuf, 0, 100);
    + J" K9 Q% s# a6 G* U8 s! J
  34.     }
    7 P5 y- x; G8 o
  35.     closesocket(sockClient);' e/ S! T  O6 A0 o- J" x
  36.     system("pause");
    - t  k/ S# A' v- P  h1 \
  37.     return 0;
    % }! c' e7 X8 P' v4 g
  38. }
复制代码
客户端代码:
2 |! @! R8 ], Z! L2 i
  1. #include<winsock2.h>7 J1 ^  l* k# w
  2. #include<stdio.h>- V- m8 r, |$ H
  3. #pragma comment(lib, "ws2_32.lib")7 V& x% A  L9 |  R. g# h
  4. void main()0 I! ~1 f( K% [
  5. {
    # ?' j' b: `. y7 U
  6.     WSADATA wsaData;. F, n2 I+ W9 u4 [2 Z5 W9 }! T
  7.     SOCKET sockClient;//客户端Socket
    : }4 o* c. W; G  G! O/ |
  8.     SOCKADDR_IN addrServer;//服务端地址
    7 \  v- b, H7 H! c
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    & j1 u5 P: F. B" J# f! c" H
  10.     char message[20] = "HelloSocket!";4 ?/ Y4 O% x8 d7 n1 ^
  11.     //定义要连接的服务端地址
    - G9 |1 U5 O/ c2 R
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    # \% Z6 \0 Y3 w9 g# O2 ?( s
  13.     addrServer.sin_family = AF_INET;7 e7 Z% `8 V: _& L. O# }; H% e
  14.     addrServer.sin_port = htons(6000);//连接端口60008 K+ c4 g4 O! n: }( g) G9 M: z
  15.     //新建客户端socket8 Z0 b+ n% V/ X! |6 Z
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    : v' m6 [$ Y+ `6 O3 K$ c. r
  17.     int s = 0;: a# w) S/ G" @
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    & B5 K! s+ `: i
  19. + G8 P/ A% u/ {
  20.     while (1){
      r+ K. _: l& ~1 o: V, P
  21.         //发送数据3 h4 {9 d$ [& ]$ D( Z: h5 w
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);8 u' N- Q- O$ Y1 l, ^
  23.         printf("to server:");
    . ?. z, ?2 l9 e  G
  24.         scanf("%s", message);
    / u% z% T1 H3 [8 E

  25. , e$ t( {" P  y* ]2 w' }! P
  26.     }- ]# r8 w4 d7 Y+ p
  27.     //关闭socket
    $ K# _) Z. N8 E/ h% c
  28.     closesocket(sockClient);3 n1 a# E# ?) \0 y
  29.     WSACleanup();- P$ n6 Y3 B# i, L& D/ G3 Y) s
  30. }
复制代码
求懂的高手来解答一下。
- H1 }/ e. z+ }7 K  l谢谢了!
& R5 q7 u! S# Y( J# u
; }  r& a0 t; o/ X+ h

& K) U: P2 u/ o6 p( G$ `' @" o' n" u% D5 d+ C* _- 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); 这句改为
1 W( c  i6 r- Q( l- D8 Z0 arecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 06:03 , Processed in 0.206645 second(s), 18 queries .

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