按下面步骤来做,可以简单体验socket API的使用。具体函数的意义,请参考其他说明文档。
下面的函数直接copy, paste就可以了。
Step1. 创建Server 程序。
新建文件socket_s.c, 内容如下:
-------------------------------------------
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 2323
#define SERVER_IP "192.168.1.101"
int main()
{
int s, s2;
struct sockaddr_in addr;
struct sockaddr_in addr2;
char buffer[256];
int sin_size;
if((s=socket(AF_INET, SOCK_STREAM, 0))<0)
{
printf("creat socket error!/n");
perror("socket");
exit(1);
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
bzero(&(addr.sin_zero), 8);
if(bind(s, (struct sockaddr *)&addr, sizeof(struct sockaddr))==-1)
{
perror("bind socket error!");
exit(1);
}
if(listen(s, 10) == -1)
{
perror("LISTEN");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
printf("server is run/n");
if((s2 = accept(s, (struct sockaddr *)&addr2, &sin_size)) ==-1 )
{
perror("accept");
exit(1);
}
printf("accept success.%d/n", s2);
if(!fork())
{
int numbytes;
char buff[256];
memset(buff, 0, 256);
printf("create new thread success./n");
if((numbytes = recv(s2, buff, sizeof(buff), 0))==-1)
{
perror("recv");
exit(1);
}
printf("%s", buff);
if(send(s2, buff, strlen(buff), 0) == -1)
perror("send");
close(s2);
exit(0);
}
close(s2);
}
close(s);
return 0;
}
-------------------------------------------
Step2. 编译Server程序
>gcc socket_s.c -o socket_s
Step3. 创建Client程序
新建文件socket_c.c, 内容如下:
----------------------------------------------------
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define PORT 2323
#define SERVER_IP "192.168.1.101"
int main(int argc, char *argv[])
{
int s, numbytes;
struct sockaddr_in addr;
char buf[128];
if((s=socket(AF_INET, SOCK_STREAM, 0))<0)
{
printf("create socket error!/n");
perror("socket");
exit(1);
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_aton(SERVER_IP, &addr.sin_addr);
bzero(&(addr.sin_zero), 8);
if( connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0 )
{
perror("connect");
exit(1);
}
printf("connect successfully!/n");
if(send(s, "hello!socket.", 13, 0) == -1)
{
perror("send");
exit(1);
}
printf("send successfully!/n");
if((numbytes = recv(s, buf, 100, 0)) ==-1 )
{
perror("recv");
exit(1);
}
buf[numbytes] = '/0';
printf("Receive from server:%s", buf);
close(s);
return 0;
}
-----------------------------------------------------
Step4. 编译Client程序
>gcc socket_c.c -o socket_c
Step5. 运行Server程序
在机器192.168.1.101上运行server.
>./socket_s
server is run
Step6. 运行Client程序
在机器192.168.1.102上运行client.
>./socket_c
connect successfully!
send successfully!
Receive from server:hello!socket.
Server端显示:
>./socket_s
server is run
accept success.4
create new thread success.
hello!socket.server is run
再次在机器192.168.1.102上运行client.
>./socket_c
connect successfully!
send successfully!
Receive from server:hello!socket.
Server端显示:
>./socket_s
server is run
accept success.4
create new thread success.
hello!socket.server is run
accept success.4
create new thread success.
hello!socket.server is run
Step7. 停止运行Server程序, Ctrl+C