网络编程的流程:
客户端:
1、创建一个socket;
2、绑定socket(IP,端口号);
因为在connect()中已经绑定了,所以不需要用blind()函数来绑定。
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(MYPORT); //端口号也就是进程,相当于应用程序的编号。端口号要与服务端的一致,所以绑定的端口号是服务端的端口号
serv_addr.sin_addr.s_addr=inet_addr(IP); //绑定的IP是本机的IP
3、发送建立连接请求connect();
4、收到连接响应;
5、发送数据send();
6、关闭socket, close(sock_fd)。
服务端端:
1、创建一个socket;
2、绑定socket(IP,端口号),blind();
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT); //绑定的端口号是自己的端口号
my_addr.sin_addr.s_addr = INADDR_ANY; // IP是客户端任意一个IP
3、侦听来自客户端的连接请求,listen();
4、有客户端连接请求,为建立请求的客户端创建一个socket,返回连接响应,
accept();
5、接受客户端发送的数据,recv();
6、关闭,close(new_fd)。
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3999 //listening port
#define BACKLOG 10 //max connect requests
#define MAXDATASIZE 100 /*max data volume */
#define IP "127.0.0.1"
main(int argc,char *argv[])
{
int sock_fd,numbytes;
// char *buf;
// buf=(char *)malloc(20);
char buf[20];
struct hostent *host;
struct sockaddr_in serv_addr;
/*socket*/
if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket creat error");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(MYPORT);
// serv_addr.sin_addr=inet_addr(IP);
serv_addr.sin_addr.s_addr=inet_addr(IP);
bzero(&(serv_addr.sin_zero),8);
/*connect*/
if(connect(sock_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1) {
perror("connect error");
exit(1);
}
printf("Please enter the string:\n");
gets(buf);
/*send*/
if((numbytes=send(sock_fd,buf,strlen(buf),0))==-1)
{
perror("send error");
exit(1);
}
printf("send:%d\n",numbytes);
close(sock_fd);
exit(0);
}
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3999 //listening port
#define BACKLOG 10 //max connect requests
#define MAXDATASIZE 100 /*max data volume */
main()
{
int sock_fd, new_fd, numbytes; /*sock_fd:listening socket;new_fd:data socket */
struct sockaddr_in my_addr; /*server address */
struct sockaddr_in their_addr; /*client address */
int sin_size;
char buf[MAXDATASIZE];
/*创建socket*/
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket create error");
exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
if (bind
(sock_fd, (struct sockaddr *) &my_addr,
sizeof(struct sockaddr)) == -1) {
perror("bind error");
exit(1);
}
printf("bind success\n");
if (listen(sock_fd, BACKLOG) == -1) {
perror("listen error");
exit(1);
}
/*accept*/
while (1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd =
accept(sock_fd, (struct sockaddr *) &their_addr,
&sin_size)) == -1) {
perror("accept error");
continue;
}
printf("received a connect from:%s\n",
inet_ntoa(their_addr.sin_addr));
if ((numbytes = recv(new_fd, buf, MAXDATASIZE, 0)) == -1) { perror("recv error");
exit(1);
}
buf[numbytes] = '\0';
printf("Received:%s\n", buf);
close(new_fd);
}
}