?? tcp41.c
字號(hào):
/* 服務(wù)器端程序 */
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
struct sockaddr myname;
char buf[80];
main()
{
int sock, new_sd, adrlen, cnt;
sock = socket(AF_UNIX, SOCK_STREAM, 0); /* 套接字的建立 */
if (sock < 0) {
printf("server socket failure %d\n", errno);
perror("server: ");
exit(1); }
myname.sa_family = AF_UNIX;
strcpy(myname.sa_data, "/tmp/billb");
adrlen = strlen(myname.sa_data) + sizeof(myname.sa_family);
unlink("/tmp/billb"); /* defensive programming */
if (bind(sock, &myname, adrlen) < 0) {
printf("server bind failure %d\n", errno);
perror("server: ");
exit(1); }
if (listen(sock, 5) < 0) { /* listen函數(shù)調(diào)用 */
printf("server listen failure %d\n", errno);
perror("server: ");
exit(1); }
/* 忽略子進(jìn)程的終止 */
signal (SIGCHLD, SIG_IGN);
/* 將服務(wù)器置于死循環(huán)狀態(tài),等待客戶端的連接請(qǐng)求的到來(lái)。
實(shí)際上,應(yīng)該用更好的辦法來(lái)結(jié)束這個(gè)死循環(huán),在這里這
個(gè)循環(huán)是被連接開(kāi)始信號(hào)或者是超級(jí)用戶終止的。 */
while (1) {
if (new_sd = accept(sock, &myname, &adrlen) < 0) {
printf("server accept failure %d\n", errno);
perror("server: ");
exit(1); }
/* 建立服務(wù)器端子進(jìn)程。此時(shí)父進(jìn)程將不再運(yùn)行
--它返回循環(huán)狀態(tài)等待下一個(gè)連接請(qǐng)求 */
printf("Socket address in server %d is %x, %s\n",
getpid(), myname.sa_data, myname.sa_data);
if (fork() == 0) { /* 建立子進(jìn)程 */
close (sock); /* 關(guān)閉套接字,因?yàn)樽舆M(jìn)程不再需要它 */
/* . . . . . */
cnt = read(new_sd, buf, strlen(buf));
/* read函數(shù)讀取套接字緩沖區(qū)中的數(shù)據(jù)到應(yīng)用緩沖區(qū)*/
printf ("Server with pid %d got message %s\n", getpid(), buf);
strcpy (buf, "Message to client");
cnt = write(new_sd, buf, strlen(buf));
printf("Socket address in server %d is %x, %s\n",
getpid(), myname.sa_data, myname.sa_data);
/* . . . . . */
close (new_sd); /* close prior to exiting */
exit(0);
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -