C指標原理(90 LINUX應用 4

2021-12-29 22:53:38 字數 4094 閱讀 8638

一、埠

1、0-1023:預留埠,超級使用者使用

2、1024-49151:已經註冊的埠號

3、49152-65535:可自由使用的埠或動態埠

二、套接字型別

1、sock_stream(位元組流套接字):面向連線,可靠的全雙工位元組流。對於af_inet來說,建立tcp連線

2、sock_dgram(資料報套接字):不保證資料正確分發,不保證傳送資料的訓序。對於af_inet來說,建立udp連線

3、sock_raw(原始套接字)

三、建立套接字

int fd;

fd=socket(af_inet,sock_stream,0);//除使用sock_raw外,最後乙個protocol被設定為0,af_inet為套介面

四、應用

1.server

deepfuture@deepfuture-laptop:~/private/mytest$ ./testtcps

server wait....

............................

server read :myhaspl

server send :hello

.....

server read :myhaspl

server send :hello

2.client

deepfuture@deepfuture-laptop:~/private/mytest$ ./testtcpc

client send....

client send :myhaspl

client read :hello

deepfuture@deepfuture-laptop:~/private/mytest$ ./testtcpc

client send....

client send :myhaspl

client read :hello

deepfuture@deepfuture-laptop:~/private/mytest$

3.source

1)server

c**

#include

#include

#include

#include

#include

//myhaspl

ssize_t readn(int fd,void *ptr,size_t maxcn)

else //無法修復錯誤,返回讀取失敗

} else if(readcn==0) break;//eof

noreadcn-=readcn;//讀取成功,但是如果讀取的字元數小於maxc,則繼續讀,因為可能資料還會繼續通過網路送過來

buf+=readcn;

if (*buf==0) break;//如果讀到字串結尾標誌則退出,必須有這句,否則會死迴圈

}

return (maxcn-noreadcn);

}

ssize_t writen(int fd,void *ptr,size_t maxcn)

else //無法修復錯誤,返回讀取失敗

} nowritecn-=writecn;

buf+=writecn;

}

return (maxcn-nowritecn);

}

int main(void)

//bind 到socket fd

address.sin_family=af_inet;//ipv4協議,af_inet6是ipv6

address.sin_addr.s_addr=htonl(inaddr_any);//l表示32位,htonl能保證在不同cpu的相同位元組序

address.sin_port=htons(1253);//埠號,s表示16位

addresslen=sizeof(address);

bind(fd,(struct sockaddr *)&address,addresslen);//bind

//建立socket佇列,指定最大可接受連線數

rc=listen(fd,32);//最多接收32個連線,開始監聽

//int listen(int sockfd, int backlog)返回:0──成功, -1──失敗

//核心會在自己的程序空間裡維護乙個佇列以跟蹤這些完成的連線但伺服器程序還沒有接手處理或正在進行的連線

if (rc==-1)

printf("server wait....\n");

while(1)

//等待連線,使用新的程序或執行緒來處理連線

fflush(stdout);

address_len=sizeof(clientaddress);

if(fd_isset(fd,&fdset))

if (pid==0)

else

}else

} }

2) client

c**

#include

#include

#include

#include

#include

//myhaspl

ssize_t readn(int fd,void *ptr,size_t maxcn)

else //無法修復錯誤,返回讀取失敗

} else if(readcn==0) break;//eof myhaspl

noreadcn-=readcn;//讀取成功,但是如果讀取的字元數小於maxc,則繼續讀,因為可能資料還會繼續通過網路送過來

buf+=readcn;

if (*buf==0) break; //如果讀到字串結尾標誌則退出,必須有這句,否則會死迴圈 myhaspl

}

return (maxcn-noreadcn);

}

ssize_t writen(int fd,void *ptr,size_t maxcn)

else //無法修復錯誤,返回讀取失敗

} nowritecn-=writecn;

buf+=writecn;

}

return (maxcn-nowritecn);

}

int main(void)

printf("client send....\n");

fflush(stdout);

//連線

address.sin_family=af_inet;//ipv4協議,af_inet6是ipv6 myhaspl

address.sin_addr.s_addr=inet_addr("127.0.0.1");//l表示32位,htonl能保證在不同cpu的相同位元組序

address.sin_port=htons(1253);//埠號,s表示16位 myhaspl

addresslen=sizeof(address);

rc=connect(fd,(struct sockaddr *)&address,addresslen);//連線伺服器 myhaspl

if (rc==-1)

//傳送資料

writen(fd,(void *)buf,strlen(buf)+1);

printf("client send :%s\n",buf);

//讀取資料

bzero(mybuf,100);

readn(fd,(void *)mybuf,100);

printf("client read :%s\n",mybuf);

close(fd);

exit(0);

}

C 指標應用

int main char str1 hello world char str2 hello world char str3 hello world char str4 hello world if str1 str2 printf str1and str2 are same n else prin...

C指標原理 5

plain view plain copy print?section data myvalue byte 67,68,69,70,0 mygs asciz c n section text globl main main 基位址 偏移位址 必須為暫存器 資料元素變址,資料元素長度 必須為暫存器 基...

C指標原理 6

內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 c 變數顯示出來。因為它具有這種能力,所以 asm 可以用作彙編指令和包含它的 c 程式之間的介面。簡單得說,內聯彙編,就是可以讓程式設計師在c語言中直接嵌入彙編 並與彙編 互動c程式中的c表示式,享受彙編的高執行效率。內聯彙編的格式是直接...