文档介绍:Linux网络编程-socket编程
【ITjob课程资料】
SOCKET编程
下面我们来编写基于SOCKET的程序。
SOKET的概念
计算机通讯当然是通过硬件(网卡)来进行通讯的,但是都是通过系统软件(OS)来实现的。所以我们要了解的是关于OS操纵网卡进行通讯的原理。
计算机中每个机器不仅仅有IP地址,还有很多端口,分别负责不同的任务,比如:80端口就是负责IIS默认的HTTP服务的,而21端口则是负责FTP通讯,注意上面我们涉及到三个概念:IP地址,端口和协议。
网卡接收到信息之后,形成一个文件(在LINUX中所有的都是文件),当然一个文件描述符来进行指向。本质上来说,SOCKET就是一个文件描述符。
比如:ept函数和recv,都是阻塞函数。pet函数的时候需要通过一个SOCKET来监听那个机器的信息(比如:IP地址),而需要用另外一个SOCKET来获得具体的信息。
首先通过SOCKET函数生成一个类似文件的唯一描述符,然后这个描述符对于内核的文件表,这个文件表存放在内存中(内核缓冲),OS通过扫描这个文件表确定通讯的呼叫方和接收方,指挥网卡发送和接收信息。 这就是我们说的基于SOCKET的编程方式。
SOCKET通常也称作“套接字”,用于描述IP地址和端口,SOCKET是一种特殊的I/O接口,它也是一种文件描述符。
它是一种常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的进程之间进行通信。
SOCKET也有一个类似于打开文件的函数调用,该函数返回一个整型的SOCKET描述符,随后的连接建立、数据传输等操作都是通过SOCKET来实现的;
用SOCKET函数可以获得本机的SOCKET描述符,如:
#include <sys/>
#include <sys/>
int i=socket(, SOCK_STREAM,0);
常用的socket传输类型
1、流式socket(SOCK_STREAM)
流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。
2、数据报socket(SOCK_DGRAM)
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。
用connect连接对方机器
函数原型如下:
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
参数:
sockfd:socket描述符
serv_addr:是一个结构体指针,其结构体的说明如下:
struct sockaddr
{
unsigned short sa_family; /*地址族*/
char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/
};
struct sockaddr_in //socketaddr的详细信息,注意,
{
short int sin_family; /*地址族*/
unsigned short sin_port; /*端口号*/
struct in_addr sin_addr; /*IP地址*/
unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/
};
struct in_addr{unsigned int s_addr;};
addrlen:地址结构体的大小。
下面我们可以写一段程序了,如下:
#include <sys/>
#include <sys/>
#include </>
#include <arpa/>
#include <>
 
int main()
{
int socket_local,iConnect;
struct sockaddr_in dest_sock={0};
socket_local=socket(,SOCK_STREAM,0);
=;
=htons(60000);
//=inet_addr("");
//inet_aton("",&