1、linux网络编程
客户端
在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序。
服务端
和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。
比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。
网络传输协议有TCP和UDP协议
2套接字
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。
Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输 层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
3、服务端客户端例程
server:
#include"stdio.h"
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
//#include"linux/in.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#include"stdlib.h"
#include"string.h"
#include <unistd.h>
int main(int argc,char **argv)
{
int s_fd;
int c_fd;
char readBuf[128]={0};
int n_read;
int mark =0;
//char *msg="i get you connect";
char msg[128]={0};
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
if(argc!=3)
{
printf("pararm is not good");
exit(-1);
}
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.socket
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd==-1)
{
perror("socket");
exit(-1);
}
s_addr.sin_family=AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
//2.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//3.listen
listen(s_fd,10);
//4.accept
int clen =sizeof(struct sockaddr_in);
while(1)
{
c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd==-1)
{
perror("accept");
}
mark++;
printf("connect\n");
printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));
if(fork()==0)
{
if(fork()==0)
{
while(1)
{
//5.send
memset(msg,0,sizeof(msg));
printf("input:");
scanf("%s",msg);
write(c_fd,msg,strlen(msg));
}
}
while(1)
{
memset(readBuf,0,sizeof(readBuf));
//5.read
n_read=read(c_fd,readBuf,100);
if(n_read==-1)
{
perror("read");
}
else
{
printf("get message:%d,%s\n",n_read,readBuf);
}
}
break;
}
}
return 0;
}
client:
#include"stdio.h"
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
//#include"linux/in.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#include"stdlib.h"
#include"string.h"
#include <unistd.h>
int main(int argc ,char **argv)
{
int c_fd;
char readBuf[128]={0};
int n_read;
// char *msg="message from client";
char msg[128]={0};
struct sockaddr_in c_addr;
if(argc!=3)
{
printf("pararm is not good");
exit(-1);
}
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.socket
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1)
{
perror("socket");
exit(-1);
}
c_addr.sin_family=AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
//2.connect
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(-1);
}
while(1)
{
if(fork()==0)
{ while(1)
{
//5.send
memset(msg,0,sizeof(msg));
printf("input");
scanf("%s",msg);
write(c_fd,msg,strlen(msg));
}
}
while(1)
{
//.read
memset(readBuf,0,sizeof(readBuf));
n_read=read(c_fd,readBuf,100);
if(n_read==-1)
{
perror("read");
}
else
{
printf("get message from server:%d,%s\n",n_read,readBuf);
}
}
}
return 0;
}