简单socket()编程

客户端:

1、socket( int af, int type, int protocol)

socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0),则使用缺省的连接方式。 对于使用一给定地址族的某一特定套接口,只支持一种协议。但地址族可设为AF_UNSPEC(未指定),这样的话协议参数就要指定了。协议号特定于进行通讯的“通讯域”。

SOCK_STREAM 提供有序的、可靠的、双向的和基于连接的字节流,使用带外数据传送机制,为Internet地址族使用TCP。 SOCK_STREAM类型的套接口为全双向的字节流。对于流类套接口,在接收或发送数据前必需处于已连接状态。用connect()调用建立与另一套接口的连接,连接成功后,即可用send()和recv()传送数据。当会话结束后,调用close()。带外数据根据规定用send()和recv()来接收。 实现SOCK_STREAM类型套接口的通讯协议保证数据不会丢失也不会重复。

如果终端协议有缓冲区空间,且数据不能在一定时间成功发送,则认为连接中断,其后续的调用也将以WSAETIMEOUT错误返回。

SOCK_DGRAM 支持无连接的、不可靠的和使用固定大小(通常很小)缓冲区的数据报服务,为Internet地址族使用UDP。 

2、int connect(int s, const struct sockaddr * name, int namelen)
用于创建与指定外部端口的连接。s参数指定一个未连接的数据报或流类套接口。如套接口未被捆绑,则系统赋给本地关联一个唯一的值,且设置套接口为已捆绑。对于流类套接口(SOCK_STREAM类型),利用名字来与一个远程主机建立连接,一旦套接口调用成功返回,它就能收发数据了。对于数据报类套接口(SOCK_DGRAM类型),则设置成一个缺省的目的地址,并用它来进行后续的send()与recv()调用。

3、int send( SOCKET s, const char FAR *buf, int len, int flags );

send就仅仅把buf中的数据copy到剩余空间里,注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>    //加了该头文件,seraddr.sin_addr.s_addr    = inet_addr(SEVERIP);则无warning

#define SEVERIP "192.168.31.103"
#define SEVERPORT 9003

int sockfd    = -1;
int ret        = -1;

char sendbuf[100];

struct sockaddr_in cliaddr = {0};
struct sockaddr_in seraddr = {0};

int main()
{
    //create socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);//地址族:AF_INET表示IPV4;
                                            //服务:SOCK_STREAM
                                            //协议缺省:0
    if(sockfd < 0)
    {
        perror("socket");
        return -1;
    }
    printf("sockfd = %d\n",sockfd);

    //initiate a connection on a socket
    seraddr.sin_family        = AF_INET;
    seraddr.sin_port        = htons(SEVERPORT);
    seraddr.sin_addr.s_addr    = inet_addr(SEVERIP);

    ret = connect(sockfd, (const struct sockaddr*)&seraddr, sizeof(seraddr));
    if(ret < 0)
    {
        perror("connect");
        return -1;
    }

    printf("connect result,ret = %d.\n", ret);

    //communication---send content
    //strcpy(sendbuf, "hello world");
    printf("***************************************\n");
    while(1)
    {
        printf("Please input you content to send:");
        memset(sendbuf, 0, sizeof(sendbuf));
        scanf("%s",sendbuf);
        ret = send(sockfd, sendbuf, strlen(sendbuf),0);
        printf("***************************************\n");
    }
    return 0;
}

 客户端

1、bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)

2、int listen(SOCKET sockfd, int backlog);
 backlog 连接请求队列(queue of pending connections)
 listen在套接字函数中表示让一个套接字处于监听到来的连接请求的状态

3、 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
本函数从sockfd的等待连接队列中抽取第一个连接,创建一个与sockfd同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为阻塞方式,则accept()阻塞调用进程直至新的连接出现。如果套接口为非阻塞方式且队列中无等待连接,则accept()返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口仍保持开放。

4、int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags)
 同步Socket的recv函数的执行流程。当应用程序调用recv函数时:(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_IP        "192.168.31.103 "
#define SERVER_PORT        9003
#define backlog            100

struct sockaddr_in seraddr = {0};
struct sockaddr_in cliaddr = {0};

int socketfd = -1, clifd = -1;
int ret = -1;

char recvbuf[100];

socklen_t len;

int main()
{
    //Create socket
    socketfd = socket(AF_INET, SOCK_STREAM, 0);
    if(socketfd < 0)
    {
        perror("Fail to creat socket");
        return -1;
    }
    printf("socketfd= %d.\n",socketfd);

    //Assigning a name to a socket
    seraddr.sin_family    = AF_INET;
    seraddr.sin_port    = htons(SERVER_PORT);
    seraddr.sin_addr.s_addr    = inet_addr(SERVER_IP);

    ret = bind(socketfd, (const struct sockaddr*)(&seraddr), sizeof(seraddr));
    if(ret < 0)
    {
        perror("Fail to bind");
        return -1;
    }

    //Listen
    ret = listen(socketfd, backlog);
    if(ret < 0)
    {
        perror("Listen");
        return -1;
    }

    //Wait for client
    clifd = accept(socketfd, (struct sockaddr*)(&cliaddr), &len);
    if(clifd < 0)
    {
        perror("Wait for client");
        return -1;
    }
    printf("Wait for client successful,fd = %d.\n",clifd);

    //communication---Receive content
    printf("***************************************\n");

    while(1)
    {
        ret = recv(clifd, recvbuf, sizeof(recvbuf), 0);
        printf("The receive substance is [%s].\n", recvbuf);
        memset(recvbuf, 0, sizeof(recvbuf));
    }

    return 0;
}
时间: 2024-12-21 05:46:29

简单socket()编程的相关文章

PHP简单socket编程

今天再看一点邮件发送的功能,所以了解一下socket变成,看到了一篇不错的文章,转发过来做个笔记吧. 原文链接:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html 文章中的例子已亲测,没有问题... 对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.  

基于java的简单Socket编程

1TCP协议与UDP协议     1.1 TCP               TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间必须建立连接,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作. TCP的

php之简单socket编程

一.什么是套接字 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字.其用于标识客户端请求的服务器和服务. 二.php套接字实例 服务端代码:socket.php <?php error_reporting(E_ALL); set_time_limit(0); $chr_13_10 = "\r\n"; //回车 换行 //ob_implicit_flush(); $address = '127.0.0.1'; $port = 10005; //创建 套接字 if(

C#版 Socket编程(最简单的Socket通信功能)

原文://http://blog.csdn.net/linybo/article/details/51141960 示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息:这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别. 第一步:用指定的端口号和服务器的ip建立一个EndPoint对像: 第二步:建立一个Socket对像: 第三步:用socket对像的Bind()方法绑定EndPo

Swift和C混合Socket编程实现简单的ping命令

这个是用Mac下的Network Utility工具实现ping命令,用Wireshark抓取的ICMP数据包: 发送ICMP数据包内容 接受ICMP数据包内容 一.icmp结构 要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议.ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方.ICMP协议是IP层的 一个协议,但是由于差错报告在发送给报文源发方时可能

socket编程——一个简单的例子(转)

原文地址:http://blog.csdn.net/wind19/article/details/6156339 从一个简单的使用TCP例子开始socket编程,其基本步骤如下: server                                                  client +++++++                                          ++++++++ 创建socket                               

socket编程(一):简单回射C/S程序

服务端代码: //echoSvr.c #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <str

Linux C Socket编程原理及简单实例

原文:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html 部分转自:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx 1.   什么是TCP/IP.UDP? 2.   Socket在哪里呢? 3.   Socket是什么呢? 4.   有很多的框架,为什么还在从Socket开始? 5.   Linux C Socket简单示例 1.什么是TCP

socket编程:简单TCP服务器/客户端编程

其实对于socket:我们需要理解的是他提供了一种编程概念,利用socket就可以利用系统已经封装好的内部进行通信,我们只需要关注应用层方面的数据控制就OK了. 一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个&