导航:首页 > 编程系统 > linuxsocket详解

linuxsocket详解

发布时间:2023-05-17 17:40:21

linux下的socket是怎么回事,如何利用其实现局域网内的数据处理

//服务端server.c
#include
<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<string.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#include
<sys/wait.h>
#define
SERVPORT
6000
/*服务器监听端口号
*/
#define
BACKLOG
10
/*
最大同时连接请求数
*/
#define
MAXDATASIZE
100
main()
{
char
buf[MAXDATASIZE];
int
sockfd,client_fd;
/*sock_fd:监听socket;client_fd:数据传输socket
*/
struct
sockaddr_in
my_addr;
/*
本机地址信息
*/
struct
sockaddr_in
remote_addr;
/*
客户端地址信息
*/
if
((sockfd
=
socket(AF_INET,
SOCK_STREAM,
0))
==
-1)
{
perror("socket创建出错!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr
=
INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if
(bind(sockfd,
(struct
sockaddr
*)&my_addr,
sizeof(struct
sockaddr))
==
-1)
{
perror("bind出错!");
exit(1);
}
if
(listen(sockfd,
BACKLOG)
==
-1)
{
perror("listen出错!");
exit(1);
}
while(1)
{
sin_size
=
sizeof(struct
sockaddr_in);
if
((client_fd
=
accept(sockfd,
(struct
sockaddr
*)&remote_addr,
&sin_size))
==
-1)
{
perror("accept出错");
continue;
}
printf("received
a
connection
from
%s\n",
inet_ntoa(remote_addr.sin_addr));
if
(!fork())
{
/*
子进程代码
*/
if
((recvbytes=recv(client_fd,
buf,
MAXDATASIZE,
0))
==-1)
{
perror("recv出错!");
close(client_fd);
exit(0);
}
buf[recvbytes]
=
'\0';
printf("from
client
Received:
%s",buf);
if
(send(client_fd,
"thanks!\n",
8,
0)
==
-1)
perror("send出错!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
//客户端client.c
#include<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<string.h>
#include
<netdb.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#define
SERVPORT
6000
#define
MAXDATASIZE
100
main(int
argc,
char
*argv[])
{
int
sockfd,
recvbytes;
char
buf[MAXDATASIZE];
struct
hostent
*host;
struct
sockaddr_in
serv_addr;
if
(argc
<
2)
{
fprintf(stderr,"Please
enter
the
server's
hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出错!");
exit(1);
}
if
((sockfd
=
socket(AF_INET,
SOCK_STREAM,
0))
==
-1)
{
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr
=
*((struct
in_addr
*)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if
(connect(sockfd,
(struct
sockaddr
*)&serv_addr,
sizeof(struct
sockaddr))
==
-1)
{
perror("connect出错!");
exit(1);
}
if
(send(sockfd,
"hello!\n",
7,
0)
==
-1)
{
perror("send出错!");
exit(1);
}
if
((recvbytes=recv(sockfd,
buf,
MAXDATASIZE,
0))
==-1)
{
perror("recv出错!");
exit(1);
}
buf[recvbytes]
=
'\0';
printf("Received:
%s",buf);
close(sockfd);
}

② linux下 socket函数的返回值代表什么

int socket;domain指明所使用的协议族,通常为PF_INET,表示互联网协议族;type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket,允许程序使用低层协议;protocol通常赋值"0"。

Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。

(2)linuxsocket详解扩展阅读:

支持下述类型描述:

SOCK_STREAM 提供有序的、可靠的、双向的和基于连接的字节流,使用带外数据传送机制,为Internet地址族使用TCP。

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

SOCK_STREAM类型的套接口为全双向的字节流。对于流类套接口,在接收或发送数据前必需处于已连接状态。用connect()调用建立与另一套接口的连接,连接成功后,即可用send()和recv()传送数据。当会话结束后,调用close()。带外数据根据规定用send()和recv()来接收。

③ Window和Linux下Socket的区别

socket编程在windows和linux下的区别有以下几点销租培:1)头文件windows下winsock.h或winsock2.hlinux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)2)初始化windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragmacomment(lib,"Ws2_32")来告知编译器链接该lib。linux下不需要3)关闭socketwindows下closesocket()linux下close()4)类型windows下SOCKETlinux下int(我喜欢用long,这样保证是4byte,因为-1我总喜欢写成0xFFFF)5)获取错误码windows下getlasterror()/WSAGetLastError()linux下,未能成功执行的socket操作亏唯会返回-1;如果包含了errno.h,就会设置errno变量6)设置非阻塞windows下ioctlsocket()linux下fcntl(),需要头文件fcntl.h7)send函数最后一个参数windows下一般设置为0linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出8)毫秒级时间获取windows下GetTickCount()linux下gettimeofday()9)多线程windows下包含process.h,使用_beginthread和_endthreadlinux下包含pthread.h,使用pthread_create和pthread_exit10)用IP定义一个地址(sockaddr_in的结构的区别)windows下addr_var.sin_addr.S_un.S_addrlinux下addr_var.sin_addr.s_addr而且Winsock里最后那个32bit的S_addr也有几个以联合(Union)的形式与它共享内存空间的成员变量(便于以其他方式赋值),而Linux的Socket没有这个联合,就是一个32bit的s_addr。遇到那种得到了是4个char的IP的形式(比如127一个,0一个,0一个和1一个共四个char),WinSock可以直接用4个S_b来赋值到S_addr里,而在Linux下,可以用边向左移位(一下8bit,共四下)边相加的方法赋值。11)异常处理linux下当连接断开,还发数据的时候,不仅send()的返型戚回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退出。为此,send()函数的最后一个参数可以设MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。

④ Linux下socket并发连接数怎么设置

并发socket连接数的多少决定于系统资源的多少,没有一个常值的.在实际开发或者linux系统管理中也会根据需要进行相应的设置.
1.一般来说每一个网络连接,都会建立相应的socket句柄,同时每个连接也会有标准输入输出等基本的文件文件句柄,而且每一个socket连接都是进行文件操作的,因此连接数决定于系统资源.

2.Linux上一般可以通过ulimit来进行相应的资源限制,默认能打开的文件描述符自己可以查看.如下图所示:

3.ulimit的命令格式:ulimit [-acdfHlmnpsStvw] [size]
参数说明:
-H 设置硬资源限制.
-S 设置软资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
-u <程序数目> 用户最多可开启的程序数目

⑤ linux 中sock是什么意思

你所说的 sock 不就是socket嘛~~,你把你所说的上面那段话中sock 全部替换成socket 就一下都读明白了。 至于linux中sock,它一般是指通过shell编程后形成的套接口文件,通过ls -l 后,第一个显示的文件类型为:s 。

至于socket ,你应该已经很明白了吧,说白了就是一个通信管道。

我擦 ,怎么都2007年的问题了,居然 在我的最新问题中显示出来了~~我勒个去

⑥ linux中socket是如何调用驱动程序

在 Linux 中包括内嵌的协议 TCP、UDP,当然还有 IP。然后是另外一个协议无关层,提供回了与各个设答备驱动程序通信的通用接口,最下面是设备驱动程序本身。
Linux 中的 socket 结构是 struct sock,这个结构是在 linux/include/net/sock.h 中定义的。这个巨大的结构中包含了特定 socket 所需要的所有状态信息,其中包括 socket 所使用的特定协议和在 socket 上可以执行的一些操作。
网络子系统可以通过一个定义了自己功能的特殊结构来了解可用协议。每个协议都维护了一个名为 proto 的结构(可以在 linux/include/net/sock.h 中找到)。这个结构定义了可以在从 socket 层到传输层中执行特定的 socket 操作(例如,如何创建一个 socket,如何使用 socket 建立一个连接,如何关闭一个 socket 等等)。

⑦ linux手册翻译——socket(7)

socket - Linux 套接字接口

本手册页描述了 Linux 网络套接字层用户接口。 套接字是用户进程和内核中网络协议栈之间的统一接口。 协议模块分为协议族(protocol families)(如 AF_INET、AF_IPX 和 AF_PACKET)和套接字类型(socket types)(如 SOCK_STREAM 或 SOCK_DGRAM)。 有关families和types的更多信息,请参阅 socket(2) 。

用户进程使用这些函数来发送或接收数据包以及执行其他套接字操作。 有关更多信息,请参阅它们各自的手册页。

socket(2) 创建套接字,connect(2) 将套接字连接到远程套接字地址,bind(2) 函数将套接字绑定到本地套接字地址,listen(2) 告诉套接字应接受新连接, accept(2) 用于获取具有新传入连接的新套接字。 socketpair(2) 返回两个连接的匿名套接字(仅为少数本地families如 AF_UNIX 实现)

send(2)、sendto(2) 和sendmsg(2) 通过套接字发送数据,而recv(2)、recvfrom(2)、recvmsg(2) 从套接字接收数据。 poll(2) 和 select(2) 等待数据到达或准备好发送数据。 此外,还可以使用 write(2)、writev(2)、sendfile(2)、read(2) 和 readv(2) 等标准 I/O 操作来读取和写入数据。

getsockname(2) 返回本地套接字地址, getpeername(2) 返回远程套接字地址。 getsockopt(2) 和 setsockopt(2) 用于设置或获取套接字层或协议选项。 ioctl(2) 可用于设置或读取一些其他选项。

close(2) 用于关闭套接字。 shutdown(2) 关闭全双工套接字连接的一部分。

套接字不支持使用非零位置查找或调用 pread(2) 或 pwrite(2)。

通过使用 fcntl(2) 在套接字文件描述符上设置 O_NONBLOCK 标志,可以在套接字上执行非阻塞 I/O。 然后所有会阻塞的操作(通常)将返回 EAGAIN(操作应稍后重试); connect(2) 将返回 EINPROGRESS 错误。 然后用户可以通过 poll(2) 或 select(2) 等待各种事件。

如果不使用poll(2) 和 select(2) ,还让内核通过 SIGIO 信号通知应用程序有关事件的信息。 为此,必须通过 fcntl(2) 在套接字文件描述符上设置 O_ASYNC 标志,并且必须通过 sigaction(2) 安装有效的 SIGIO 信号处理程序。 请参阅下面的信号讨论。

每个套接字域(families)都有自己的套接字地址格式,具有特定于域的地址结构。 这些结构的首字段都是整数类型的“家族”字段(类型为 sa_family_t),即指出自己的套接字域或者说是protocol families。 这允许对所有套接字域可以使用统一的系统调用(例如,connect(2)、bind(2)、accept(2)、getsockname(2)、getpeername(2)),并通过套接字地址来确定特定的域。

为了允许将任何类型的套接字地址传递给套接字 API 中的接口,定义了类型 struct sockaddr。 这种类型的目的纯粹是为了允许将特定于域的套接字地址类型转换为“通用”类型,以避免编译器在调用套接字 API 时发出有关类型不匹配的警告。
struct sockaddr 以及在AF_INET常用的地址结构struct sockaddr_in如下所示,sockaddr_in.sin_zero是占位符:

此外,套接字 API 提供了数据类型 struct sockaddr_storage。 这种类型适合容纳所有支持的特定于域的套接字地址结构; 它足够大并且正确对齐。 (特别是它足够大,可以容纳 IPv6 套接字地址。)同struct sockaddr一样,该结构体包括以下字段,可用于标识实际存储在结构体中的套接字地址的类型: sa_family_t ss_family;
sockaddr_storage 结构在必须以通用方式处理套接字地址的程序中很有用(例如,必须同时处理 IPv4 和 IPv6 套接字地址的程序)。

下面列出的套接字选项可以使用setsockopt(2) 设置并使用getsockopt(2) 读取。

当写入已关闭(由本地或远程端)的面向连接的套接字时,SIGPIPE 被发送到写入进程并返回 EPIPE。 当写调用指定 MSG_NOSIGNAL 标志时,不发送信号。

当使用 FIOSETOWN fcntl(2) 或 SIOCSPGRP ioctl(2) 请求时,会在 I/O 事件发生时发送 SIGIO。 可以在信号处理程序中使用 poll(2) 或 select(2) 来找出事件发生在哪个套接字上。 另一种方法(在 Linux 2.2 中)是使用 F_SETSIG fcntl(2) 设置实时信号; 实时信号的处理程序将使用其 siginfo_t 的 si_fd 字段中的文件描述符调用。 有关更多信息,请参阅 fcntl(2)。

在某些情况下(例如,多个进程访问单个套接字),当进程对信号做出反应时,导致 SIGIO 的条件可能已经消失。 如果发生这种情况,进程应该再次等待,因为 Linux 稍后会重新发送信号。

核心套接字网络参数可以通过目录 /proc/sys/net/core/ 中的文件访问。

These operations can be accessed using ioctl(2):

error = ioctl(ip_socket, ioctl_type, &value_result);

Valid fcntl(2) operations:

Linux assumes that half of the send/receive buffer is used for internal kernel structures; thus the values in the corresponding /proc files are twice what can be observed on the wire. Linux will allow port reuse only with the SO_REUSEADDR option when this option was set both in the previous program that performed a bind(2) to the port and in the program that wants to reuse the port. This differs from some implementations (e.g., FreeBSD) where only the later program needs to set the SO_REUSEADDR option. Typically this difference is invisible, since, for example, a server program is designed to always set this option.

⑧ linux socket和sock结构体的区别

//**************************************************************************
/* 1、每一个打开的文件、socket等等都用一个file数据结构代表,这样文件和socket就通过inode->u(union)中的各个成员来区别:
struct inode {
.....................
union {
struct ext2_inode_info ext2_i;
struct ext3_inode_info ext3_i;
struct socket socket_i;
.....................
} u; };
2、每个socket数据结构都有一个sock数据结构成员,sock是对socket的扩充,两者一一对应,socket->sk指向对应的sock,sock->socket
指向对应的socket;
3、socket和sock是同一事物的两个侧面,为什么不把两个数据结构合并成一个呢?这是因为socket是inode结构中的一部分,即把inode结
构内部的一个union用作socket结构。由于插口操作的特殊性,这个数据结构中需要有大量的结构成分,如果把这些成分全部放到socket
结构中,则inode结构中的这个union就会变得很大,从而inode结构也会变得很大,而对于其他文件系统这个union是不需要这么大的,
所以会造成巨大浪费,系统中使用inode结构的数量要远远超过使用socket的数量,故解决的办法就是把插口分成两部分,把与文件系
统关系密切的放在socket结构中,把与通信关系密切的放在另一个单独结构sock中;
*/

struct socket
{
socket_state state; // 该state用来表明该socket的当前状态
typedef enum {
SS_FREE = 0, /* not allocated */
SS_UNCONNECTED, /* unconnected to any socket */
SS_CONNECTING, /* in process of connecting */
SS_CONNECTED, /* connected to socket */
SS_DISCONNECTING /* in process of disconnecting */
} socket_state;
unsigned long flags; //该成员可能的值如下,该标志用来设置socket是否正在忙碌
#define SOCK_ASYNC_NOSPACE 0
#define SOCK_ASYNC_WAITDATA 1
#define SOCK_NOSPACE 2
struct proto_ops *ops; //依据协议邦定到该socket上的特定的协议族的操作函数指针,例如IPv4 TCP就是inet_stream_ops
struct inode *inode; //表明该socket所属的inode
struct fasync_struct *fasync_list; //异步唤醒队列
struct file *file; //file回指指针
struct sock *sk; //sock指针
wait_queue_head_t wait; //sock的等待队列,在TCP需要等待时就sleep在这个队列上
short type; //表示该socket在特定协议族下的类型例如SOCK_STREAM,
unsigned char passcred; //在TCP分析中无须考虑
};

⑨ linux socket是什么意思

socket接口是TCP/IP网络的API,socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解socket接口。
socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解socket了。网络的 socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也具有一个类似于打开文件的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。常用的socket类型有两种:流式socket (SOCK_STREAM)和数据报式socket(SOCK_DGRAM)。流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket是一种无连接的socket,对应于无连接的UDP服务应用。
socket建立
为了建立socket,程序可以调用socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:
int socket(int domain, int type, int protocol); domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型: SOCK_STREAM 或SOCK_DGRAM,socket接口还定义了原始socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值 "0"。 socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。
socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用socket函数时,socket执行体将建立一个socket,实际上 "建立一个socket"意味着为一个socket数据结构分配存储空间。socket执行体为你管理描述符表。 两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。socket数据结构中包含这五种信息。
socket配置
通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。
bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。bind函数原型为:
int bind(int sockfd,struct sockaddr*my_addr, int addrlen); Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。
struct sockaddr结构类型是用来保存socket信息的:
struct sockaddr {
unsigned short sa_family; /*地址族,AF_xxx*/ char sa_data[14]; /*14字节的协议地址*/ };
sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。 另外还有一种结构类型: struct sockaddr_in {
short int sin_family; /*地址族*/
unsigned short int sin_port; /*端口号*/ struct in_addr sin_addr; /*IP地址*/
unsigned char sin_zero[8];/*填0保持与sockaddr同样大小*/ };
这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向
sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。 使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:

my_addr.sin_port=0; /* 系统随机选择一个未被使用的端口号*/ my_addr.sin_addr.s_addr=INADDR_ANY; /* 填入本机IP地址*/

通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。同样,通过将my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。
注意在使用bind函数是需要将sin_port和sin_addr转换成为网络字节优先顺序;而sin_addr则不需要转换。
计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。
htonl():把32位值从主机字节序转换成网络字节序 htons():把16位值从主机字节序转换成网络字节序 ntohl():把32位值从网络字节序转换成主机字节序 ntohs():把16位值从网络字节序转换成主机字节序
bind()函数在成功被调用时返回0;出现错误时返回 "-1"并将errno置为相应的错误号。需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。
连接建立
面向连接的客户程序使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:
int connect(int sockfd, struct sockaddr*serv_addr,int addrlen); Sockfd 是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地质结构的长度。 connect函数在出现错误时返回-1,并且设置errno为相应的错误码。
进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到达端口。
connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。
listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。 int listen(int sockfd, int backlog);
Sockfd 是socket系统调用返回的socket 描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们(参考下文)。Backlog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20。如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。
当出现错误时listen函数返回-1,并置相应的errno错误码。
accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。 int accept(int sockfd, void*addr, int*addrlen);
sockfd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息(某台主机从某个端口发出该请求);addrten通常为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。出现错误时accept函数返回-1并置相应的errno值。 首先,当accept函数监视的 socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的 socket上监听,同时可以在新的socket描述符上进行数据传输操作。 数据传输
send()和recv()这两个函数用于面向连接的socket上进行数据传输。 int send(int sockfd, const void*msg, int len, int flags);
Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。
send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。
int recv(int sockfd,void*buf,int len,unsigned int flags);

阅读全文

与linuxsocket详解相关的资料

热点内容
三星2016视频文件夹 浏览:317
旧手机创新手机数据怎么传 浏览:954
怎么删除领克app里的记录 浏览:254
捷波朗弦月3最新版本 浏览:123
win10保存不了文件 浏览:735
jsonobject解析list 浏览:558
网站未知回应怎么回事 浏览:103
refdoc数据库 浏览:602
传奇世界文件在哪里下载 浏览:306
国际象棋编程哪个好 浏览:255
一加5截屏在哪个文件夹 浏览:764
发送失败错误代码10009 浏览:508
word转换位图 浏览:237
百度文件包含违规内容提取不了 浏览:317
大名网站推广多少钱 浏览:791
喜欢网络词都有什么 浏览:811
怎么设置iphone网络 浏览:281
cad坐标转换图文教程 浏览:397
苹果12原装数据线怎么感觉有点硬 浏览:764
js获取div中的图片不显示不出来 浏览:291

友情链接