`
haoningabc
  • 浏览: 1483082 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

socket基础(c语言)

阅读更多
不使用select
普通的基础socket连接,对多个客户端的反应
是有顺序的,根据建立连接的顺序




1.建立服务端socket
2.服务端socket准备建立新的connection,accept阻塞
3.客户端建立socket,
客户端connect 服务端
4.服务端accept返回,建立了一个connnection
并阻塞到recv,准备接受数据(几个客户端就会简历几个connection)
5.客户端向socket发送数据
6.服务端的connection 这时候recv收到数据并返回



一言不合上代码,先用c写:
server.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    listenfd, connfd;
    struct sockaddr_in     servaddr;
    char    buff[4096];
    int     n;

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(6666);

    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    if( listen(listenfd, 10) == -1){
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    printf("======waiting for client's request======\n");
    while(1){
    if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
        continue;
    }
    n = recv(connfd, buff, MAXLINE, 0);
    buff[n] = '\0';
    printf("recv msg from client: %s\n", buff);
    close(connfd);
    }

    close(listenfd);
}     

client.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
    
#define MAXLINE 4096

int main(int argc, char** argv)
{   
    int    sockfd, n;
    char    recvline[4096], sendline[4096];
    struct sockaddr_in    servaddr;
    
    if( argc != 2){
    printf("usage: ./client <ipaddress>\n");
    exit(0);
    }
    
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
    exit(0);
    }
    
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6666);
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
    printf("inet_pton error for %s\n",argv[1]);
    exit(0);
    }
    
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }
    
    printf("send msg to server: \n");
    fgets(sendline, 4096, stdin);
    if( send(sockfd, sendline, strlen(sendline), 0) < 0)
    {
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
    exit(0);
    }

    close(sockfd);
    exit(0);
}


gcc server.c -o server
gcc client.c -o client

测试server端:
[root@centos32 c]# ./server 
======waiting for client's request======


开三个客户端观察
第一个
[root@centos32 c]# ./client  127.0.0.1
send msg to server: 


这里先不输入
-------------------------
第二个
[root@centos32 c]# ./client  127.0.0.1
send msg to server: 
hello this is 2222222222222
回车

观察server端没有反应

---------------------
第三个客户端:

[root@centos32 c]# ./client  127.0.0.1
send msg to server: 
hello this is 33333333
回车

观察server端没有反应

---------------
再到第一个客户端
[root@centos32 c]# ./client  127.0.0.1
send msg to server: 
this is 111111111

回车,
观察服务端


[root@centos32 c]# ./server 
======waiting for client's request======
recv msg from client: hello this is 1111111111

recv msg from client: hello this is 2222222222222

recv msg from client: hello this is 33333333


发现,服务端返回的值是按照客户端打开connection的顺序返回的
说明给服务端建立连接后,就阻塞在recv上了
,即使后面的client先发送数据,也不会先返回


想哪个先发送就先返回需要使用select等

如果没有select等,
socket是阻塞的,
第一个客户端连接的时候就accept到那里等着了,只有第一个有反应了,后两个才会继续进行,
服务端返回的也是按连接建立的顺序返回的


再看socket的建立过程
一共四个过程,服务端阻塞两次,等待连接和接收消息
客户端建立连接和发送数据两次触发服务端

-------------(1)-------------
服务端:
server端先建立个socket句柄
listenfd = socket(AF_INET, SOCK_STREAM, 0)
绑定地址
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
监听socket
listen(listenfd, 10)
建立连接句柄,
并且阻塞##################
connfd =accept(listenfd, (struct sockaddr*)NULL, NULL)
注意
------------(2)---------
客户端:
建立socket句柄
sockfd = socket(AF_INET, SOCK_STREAM, 0)
用这个句柄连接到远程的地址
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
--------------(3)--------------
服务端accept的阻塞返回
n = recv(connfd, buff, MAXLINE, 0);
阻塞数据################
---------------(4)---
客户端
句柄发送数据
send(sockfd, sendline, strlen(sendline), 0)
----------------(5)--------------
服务端:
接受消息recv返回

######################################################
这样的普通socket会有顺序问题,

如果想,后面客户端先发送数据,server端不等待前面的客户端反应,就直接返回后面客户端的相应,
需要引入select等

参考http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
分享到:
评论

相关推荐

    socket编程c语言发送文件

    Socket编程是计算机网络通信的核心技术之一,特别是在C语言环境下,它是构建客户端-服务器应用程序的基石。本示例涉及的是如何使用C语言通过socket接口来发送文件。以下将详细阐述相关知识点: 1. **Socket概念**:...

    Socket编程 c语言 (最新 带例程 可直接编译运行)

    Socket 编程是计算机网络通信的核心技术之一,尤其在C语言环境下,它是构建TCP/IP通信的基础。本篇将深入解析Socket编程的相关知识点,包括Socket的基本概念、类型、创建过程以及连接建立。 首先,Socket(套接字)...

    C语言编程-socket基础.pdf

    在C语言编程中,Socket编程是构建网络应用程序的基础,尤其在TCP/IP协议栈上。Socket最初是为了支持TCP/IP协议而设计,但现在它已经成为Windows平台上非远程过程调用(RPC)网络应用开发的重要工具。Socket提供了一...

    C语言实现socket通信

    总之,C语言实现的Socket通信是一个基础且重要的技能,对于理解网络编程原理和开发网络应用至关重要。通过实践上述步骤,开发者可以深入理解网络通信过程,为进一步学习更复杂的网络编程技术奠定坚实基础。

    c语言编程-socket基础

    本文将深入探讨Socket的基础知识,包括其工作原理、API函数的使用以及C语言中实现Socket编程的关键步骤。 首先,Socket最初是为支持TCP/IP协议设计的,但现在已经成为Windows和其他操作系统上开发非远程过程调用...

    linux C语言 socket通信聊天小程序

    本项目涉及的"Linux C语言 socket通信聊天小程序"是一个基础的网络聊天应用,支持群聊和私聊功能。 首先,我们需要理解什么是Socket。Socket是网络编程的一个接口,它提供了进程间通信(IPC)的能力,特别是在网络...

    C语言socket通讯TXT文件传输

    1. **Socket编程**:Socket是网络编程的基础,它提供了一种进程间通信(IPC)的方式,特别是在不同网络上的进程之间。C语言中的socket API允许开发者创建、连接和通信套接字。 2. **TCP/IP协议栈**:TXT文件传输...

    跨平台socket网络通信c语言实现

    首先,让我们理解Socket编程的基础。Socket是一种通信接口,它允许程序通过网络发送和接收数据。在C语言中,我们通常使用Berkeley套接字API,它提供了一系列函数来创建、绑定、监听和连接Socket。 1. **创建Socket*...

    C语言Socket简单编程指南

    整个文档是一份对于初学者友好、深入浅出的C语言Socket编程指南,涵盖了从基础概念到实际编程实践的各个方面。文档的编写目的是帮助读者通过理解Socket通信机制的原理和结构,掌握在Linux环境下使用C语言进行网络...

    socket网络编程 c语言源码

    在IT领域,网络编程是构建分布式系统和网络应用的基础,其中C语言因其高效和灵活性而常被用于底层网络通信的实现。本项目"socket网络编程 c语言源码"提供了客户端和服务器端的完整源代码,涉及到的核心技术主要包括...

    c语言编写 基于SOCKET HTTP Json 请求

    通过学习和理解这段代码,开发者可以掌握C语言实现HTTP POST请求和JSON数据传输的基础知识。 总之,C语言的SOCKET编程结合HTTP协议和JSON数据格式,提供了在各种应用场景中与服务器交互的能力,如API调用、数据上传...

    Windows环境下socket编程(C语言编写)

    1. **Socket基础**: - Socket是网络通信的一种接口,由Berkeley大学开发,因此也被称为Berkeley Sockets或BSD Sockets。 - 在C语言中,通过`&lt;winsock2.h&gt;`头文件和`ws2_32.lib`库来访问Windows Socket API。 - ...

    C语言SOCKET编程FTP

    在IT行业中,C语言SOCKET编程是网络通信的基础,而FTP(File Transfer Protocol)则是互联网上广泛使用的文件传输协议。本项目是利用C语言实现的一个FTP客户端,涵盖了FTP的基本操作,如创建和删除目录、查看目录...

    C语言socket实现文件下载

    总结起来,C语言socket实现文件下载涉及到网络编程的基础知识,包括socket创建、服务器的监听与连接处理、客户端的请求与接收、多线程技术的应用以及文件传输中的进度反馈。通过理解这些概念和步骤,开发者可以构建...

    c语言socket编程 与服务器长连接的客户端程序

    C语言作为底层编程的基础,常被用于实现高效、低级别的网络通信。本篇将详细讲解C语言中的socket编程,以及如何构建一个与服务器保持长连接的客户端程序。 首先,我们需要了解什么是Socket。Socket是网络通信的一种...

    C语言编程-socket基础.doc

    C语言编程-socket基础

    C语言socket编程.pdf

    在学习C语言socket编程时,开发者需要掌握网络基础知识,理解端口号的作用,学会解析和构造IP地址和端口,以及如何处理并发连接和异常情况。此外,调试网络程序通常比较复杂,学会使用网络抓包工具如Wireshark进行...

    C语言socket编程

    本文档旨在为读者提供C语言Socket编程的指导,涵盖了Socket编程的基础知识和实践经验。下面是本文档中所涵盖的知识点: 1. 什么是套接字? 套接字是一种使用标准Unix文件描述符和其他程序通讯的方式。它可以用来与...

    C语言基于socket多人聊天

    本项目“C语言基于socket多人聊天”就是利用C语言和socket API来构建一个支持多人实时交流的聊天系统。接下来,我们将深入探讨相关知识点。 1. **C语言基础**:C语言是一种强大的编程语言,它提供了低级别的控制,...

Global site tag (gtag.js) - Google Analytics