最近在学习Linux网络编程,写下此学习笔记。
服务器端:
1.调用socket()函数定义套接字;
2.调用bind()函数绑定本地地址和端口;
3.调用listen()函数启动监听端;
4.调用accept()函数从已连接队列中提取客户链接,accept为阻塞类型函数,当连接队列为空时,阻塞等待;
5.调用IO函数与客户端通讯;
6.关闭套接字;
客户端:
1. 调用socket()函数创建套接字;
2. 调用connect()函数链接服务器端;
3. 调用IO函数(read/write等)与服务器端进行通讯;
4. 调用close()关闭套接字。
服务器端:
1.调用socket()函数定义套接字
2.调用bind()函数绑定本地地址和端口;
3.调用recvfrom()和sendto()函数进行通信;
客户端
1.调用socket()函数创建套接字;
2.调用recvfrom()和sendto()函数进行通信;
/* * TCP--server */
#include
#include
#include
#include
#include
#include
int main(int argc,char*argv[]) // 执行时候输入端口号
{
if(argc != 2)
{
printf("too few arg!\n");
exit(1);
}
/* 1.创建套接字 */
int sockfd = socket(AF_INET,SOCK_STREAM,0);
printf("sockfd:%d\n",sockfd);
/* 2.绑定地址 */
struct sockaddr_in srvaddr,cliaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr,len);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[1]));
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr *)&srvaddr,len);
/* 3.监听套接字 */
listen(sockfd,5); // “5”表示最大监听个数为5
char peer[16];
/* 4.等待客户端发起连接,连接成功就返回一个新的文件描述符 */
int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
if(connfd > 0)
{
printf("new client connect:[%s]\n",
(char *)inet_ntop(AF_INET,&cliaddr.sin_addr,peer,len)
);
}
char buf[100]; // 用于存放读取到的数据
while(1)
{
/* 每次读取前清空缓冲区 */
bzero(buf,100);
/* 阻塞读取数据 */
//read(connfd,buf,sizeof(buf)); 可以直接调用IO函数
recv(connfd,buf,sizeof(buf),0);
printf("from client:%s\n",buf);
/* 如果客户端发出“quit”则退出 */
if(strncmp(buf,"quit",4) == 0)
break;
}
/* 通讯完毕,关闭套接字 */
close(connfd);
close(sockfd);
return 0;
}
/* * TCP---client */
#include
#include
#include
#include
#include
#include
int main(int argc, char const *argv[])
{
if (argc != 3)
{
fprintf(stderr, " too few arg for %s\n", argv[0]);
exit(1);
}
/* 1.创建套接字 */
int sockfd = socket (AF_INET, SOCK_STREAM, 0);
printf("sockfd : %d\n", sockfd);
/* 设置服务器ip与端口号 */
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET, argv[1], &seraddr.sin_addr);
/* 发送连接请求 */
int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
if (ret == -1)
{
fprintf(stderr, "connect error!\n" );
exit(1);
}
/* 发送消息 */
char buf[100]; //用于存储发送的数据
while(1)
{
bzero(buf, 100);
fgets(buf, 100, stdin);
send(sockfd, buf, strlen(buf),0);
if (strncmp(buf, "quit", 4) == 0)
break;
}
/* 通讯结束,关闭套接字 */
close(sockfd);
return 0;
}
/* * UDP -----server */
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[]) // 执行时需要指定端口号
{
/* 1.创建套接字 */
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
/* 2.绑定服务器地址 */
struct sockaddr_in srvaddr;
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[1]));
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(srvaddr));
/* 3.调用IO函数进行通讯 */
char buf[100];
struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);
while(1)
{
bzero(buf,100);
bzero(&cliaddr,len);
recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len);
printf("from client:%s",buf);
if(strncmp(buf,"quit",4) == 0)
break;
}
/* 4.关闭套接字文件 */
close(sockfd);
}
/* * UDP----client */
/* UDP客户端 */
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[]) // ./Jack 192.168.1.3 50001
{
/* 1.创建套接字 */
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
/* 2.设置服务器的IP与端口号 */
struct sockaddr_in srvaddr;
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
/* 调用IO函数进行通讯 */
char buf[100];
while(1)
{
bzero(buf,100);
fgets(buf,100,stdin);
sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,sizeof(srvaddr));
if(strncmp(buf,"quit",4) == 0)
break;
}
/* 4.关闭套接字 */
close(sockfd);
return 0;
}