Linux下socket简单应用
系统调用接口函数
1. int socket(int protofamily, int type, int protocol);//返回sockfd
socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
2. int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。
3. int listen(int sockfd, int backlog); //服务器端调用,监听
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //客户端调用
如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。
4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返 回连接connect_fd
服务端调用,用来接收存放于listeningredients队列中的连接。最新版函数:int accept4(int sockfd, struct sockaddr *addr,socklen_t *addrlen, int flags);。可以直接在最后一个标志位设置相关参数,减少fcntl函数的调用直接在最后的标志位设置SOCK_NONBLOCK和SOCK_CLOEXEC属性.
5. ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count)
linux的io系统调用接口函数
ssize_t为有符号整形。
server端简单示例:
/*************************************************************************
> File Name: socketTest.cpp
> Author:fangzhi chen
> Mail:1242692800@qq.com
> Created Time: 2016年09月19日 星期一 21时16分19秒
************************************************************************/
#include<stdio.h>
#include <unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<errno.h>
int main(){
int serverFd=socket(AF_INET,SOCK_STREAM|SOCK_CLOEXEC,0);
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8002);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(serverFd,(struct sockaddr *)(&serverAddr),sizeof(serverAddr))<0)
perror("socket::bind");
if(listen(serverFd,20)<0)
perror("socket::listen");
struct sockaddr_in clientAddr;
socklen_t clientAddrLen;
int sock_fd;
char buf[10];
if((sock_fd=accept(serverFd,(struct sockaddr *)(&clientAddr),&clientAddrLen))<0)
perror("socket::accept");
while(read(sock_fd,buf,10)){
printf("%s",buf);
//write(sock_fd,buf,10);
}
return 0;
}
客户端简单实例:
/*************************************************************************
> File Name: socketClient.cpp
> Author:fangzhi chen
> Mail:1242692800@qq.com
> Created Time: 2016年09月20日 星期二 16时31分28秒
************************************************************************/
#include<unistd.h>
#include<string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<arpa/inet.h>
int main(){
int clientFd;
if((clientFd=socket(AF_INET, SOCK_STREAM, 0)) < 0)
¦ perror("socket::create");
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8002);
// serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_addr.s_addr = inet_addr("10.26.230.129");
perror("socket::connect");
if(connect(clientFd, (struct sockaddr*)&serverAddr, sizeof(serverAddr))<0)
perror("socket::connect");
char buf[100];
while(1){
int n = read(0,buf,100);
write(clientFd,buf,n);
}
return 0;
}