学习链接:
http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html#!comments
http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html
服务器代码:
//服务器代码
#include <sys/socket.h>//包含了socket相关的函数
#include <netinet/in.h>//包含了地址结构,如struct sockaddr_in
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
//定义sockfd
int server_sockfd= socket(AF_INET, SOCK_STREAM,0);
//定义sockaddr_in
sockaddr_in server_addr;
server_addr.sin_family= AF_INET;
server_addr.sin_port= htons(8880);
server_addr.sin_addr.s_addr= htonl(INADDR_ANY); //htonl将一个32位数从主机字节顺序转换成网络字节顺序
if(bind(server_sockfd, (sockaddr *)&server_addr, sizeof(server_addr))== -1)
{
perror("bind");
exit(1);
}
if(listen(server_sockfd, 20)== -1) //20表示socket可以排队的最大连接数
{
perror("listen");
exit(1);
}
char buffer[1024];
//int conn= accept(server_sockfd, (sockaddr *)NULL, NULL);
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
int conn= accept(server_sockfd, (sockaddr *)&client_addr, &length);
printf("%s\n",inet_ntoa(client_addr.sin_addr)); //输出客户端ip
if(conn< 0)
{
perror("connect");
exit(1);
}
while(1)
{
memset(buffer, 0, sizeof buffer);
int len= recv(conn, buffer, sizeof buffer, 0);
fputs(buffer, stdout);
send(conn, buffer, len, 0);
}
close(conn);
close(server_sockfd);
return 0;
}
客户端代码:
//客户端代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> //inet_addr函数的头文件
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
//定义sockfd
int client_sockfd= socket(AF_INET, SOCK_STREAM, 0);
//定义sockaddr_in
sockaddr_in serveraddr;
serveraddr.sin_family= AF_INET;
serveraddr.sin_port= htons(8880);
serveraddr.sin_addr.s_addr= inet_addr("127.0.0.1");
if( connect(client_sockfd, (sockaddr *)&serveraddr, sizeof (serveraddr)) == -1)
{
perror("connect");
exit(1);
}
char sendbuf[1024];
char recvbuf[1024];
while(fgets(sendbuf, sizeof(sendbuf), stdin)!= NULL)
{
send(client_sockfd, sendbuf, strlen(sendbuf), 0);
recv(client_sockfd, recvbuf, sizeof recvbuf, 0);
fputs(recvbuf, stdout);
memset(sendbuf, 0, sizeof sendbuf);
memset(recvbuf, 0, sizeof recvbuf);
}
close(client_sockfd);
return 0;
}