1、数据传输
//发送数据,成功返回发送的字节数
//发送成功只能表示数据已经无错误的发送到网络驱动程序上
ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
//sendto可以为无连接的套接字指定一个目标地址
//面向连接的套接字连接中隐含目标地址
ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);
//指定多重缓冲区传输数据
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
struct msghdr{
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
int msg_iov_len;
.....
};
//接收数据
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
2、通信程序-服务器端
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct sockaddr_in clientaddr, serveraddr;
int sockfd;
int connfd;
int addrlen;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);
bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
listen(sockfd,128);
while(1){
addrlen = sizeof(clientaddr);
connfd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen);
int ret;
do{
char buf[1024];
memset(buf, '\0',sizeof(buf));
ret = recv(connfd,buf, sizeof(buf), 0);
write(STDOUT_FILENO, buf, strlen(buf));
char dst[128];
printf("from ip:%s\tport:%d\n",inet_ntop(AF_INET, &clientaddr.sin_addr, dst, sizeof(dst)), ntohs(clientaddr.sin_port));
printf("*------------------------*\n");
memset(buf, '\0',sizeof(buf));
read(STDOUT_FILENO, buf, strlen(buf));
send(connfd,buf,sizeof(buf), 0);
printf("msg is sent\n");
printf("*------------------------*\n");
}while(ret);
close(connfd);
}
close(sockfd);
return 0;
}
2、通信程序-客户端
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
struct sockaddr_in serveraddr;
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);
connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
while(1){
char buf[1024] = { 0 };
read(STDOUT_FILENO, buf, sizeof(buf));
send(sockfd, buf, strlen(buf), 0);
printf("msg is sent\n");
printf("*------------------------*\n");
memset(buf, '\0',sizeof(buf));
recv(sockfd,buf, sizeof(buf), 0);
write(STDOUT_FILENO, buf, strlen(buf));
char dst[128];
printf("from ip:%s\tport:%d\n",inet_ntop(AF_INET, &serveraddr.sin_addr, dst, sizeof(dst)), ntohs(serveraddr.sin_port));
printf("*------------------------*\n");
}
close(sockfd);
return 0;
}
3、
//设置套接字选项
int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);
//查看选项的当前值
int getsockopt(int socket, int level, int option, void *restrict val, socklen_t *restrict lenp);
4、带外数据:允许更高优先级的数据传输,TCP支持带外数据(称为紧急数据)仅支持一个字节的紧急数据,UDP不支持。TCP支持紧急标记:在普通数据流中紧急数据所在的位置。